discourse/app/services/notifications/delete_previous_notifications.rb
Roman Rizzi 1ad47030fe
REFACTOR: Use a consolidation rule for collapsing likes. (#15393)
This PR moves the behavior from the PostAlerter. We delete an existing liked notification and set the `username2` attribute to the previous `display_username`. We repeat this process unless the last one is old enough or it's not in the most recent ones.
2021-12-23 09:44:03 -03:00

57 lines
1.6 KiB
Ruby

# frozen_string_literal: true
# Create a new notification while deleting previous versions of it.
#
# Constructor arguments:
#
# - type: The notification type. e.g. `Notification.types[:private_message]`
# - previous_query_blk: A block with the query we'll use to find previous notifications.
#
# Need to call #set_precondition to configure this:
#
# - precondition_blk: A block that receives the mutated data and returns true if we have everything we need to consolidate.
#
# Need to call #set_mutations to configure this:
#
# - set_data_blk: A block that receives the notification data hash and mutates it, adding additional data needed for consolidation.
module Notifications
class DeletePreviousNotifications < ConsolidationPlan
def initialize(type:, previous_query_blk:)
@type = type
@previous_query_blk = previous_query_blk
end
def can_consolidate_data?(notification)
return false if notification.notification_type != type
@data = consolidated_data(notification)
precondition_blk.nil? || precondition_blk.call(@data, notification)
end
def consolidate_or_save!(notification)
@data ||= consolidated_data(notification)
return unless can_consolidate_data?(notification)
notifications = user_notifications(notification, type)
if previous_query_blk.present?
notifications = previous_query_blk.call(notifications, data)
end
notification.data = data.to_json
Notification.transaction do
notifications.destroy_all
notification.save!
end
notification
end
private
attr_reader :type, :data, :precondition_blk, :previous_query_blk
end
end