docbrown/app/services/notifications/update.rb

39 lines
1.2 KiB
Ruby

module Notifications
class Update
delegate :article_data, :comment_data, :user_data, :organization_data, to: Notifications
def initialize(notifiable, action = nil)
@notifiable = notifiable
@action = action
end
def self.call(*args)
new(*args).call
end
def call
return unless [Article, Comment].include?(notifiable.class)
notifications = Notification.where(
notifiable_id: notifiable.id,
notifiable_type: notifiable.class.name,
action: action,
)
# as we only select the first notification right after, there is no need
# to load all of them in memory with `.blank?`, thus we choose `.none?`
return if notifications.none?
new_json_data = {}
new_json_data[notifiable.class.name.downcase] = public_send("#{notifiable.class.name.downcase}_data", notifiable)
new_json_data[:user] = user_data(notifiable.user)
add_organization_data = notifiable.is_a?(Article) && notifiable.organization
new_json_data[:organization] = organization_data(notifiable.organization) if add_organization_data
notifications.update_all(json_data: new_json_data)
end
private
attr_reader :notifiable, :action
end
end