43 lines
1003 B
Ruby
43 lines
1003 B
Ruby
class Notifier
|
|
attr_reader :source
|
|
|
|
class << self
|
|
def for(source)
|
|
case source
|
|
when Event
|
|
"Notifier::#{source.eventable.class}EventNotifier".safe_constantize&.new(source)
|
|
when Mention
|
|
MentionNotifier.new(source)
|
|
end
|
|
end
|
|
end
|
|
|
|
def notify
|
|
if should_notify?
|
|
# Processing recipients in order avoids deadlocks if notifications overlap.
|
|
recipients.sort_by(&:id).map do |recipient|
|
|
notification = Notification.create_or_find_by(user: recipient, card: source.card) do |n|
|
|
n.source = source
|
|
n.creator = creator
|
|
n.unread_count = 1
|
|
end
|
|
|
|
unless notification.previously_new_record?
|
|
notification.update!(source: source, creator: creator, read_at: nil, unread_count: notification.unread_count + 1)
|
|
end
|
|
|
|
notification
|
|
end
|
|
end
|
|
end
|
|
|
|
private
|
|
def initialize(source)
|
|
@source = source
|
|
end
|
|
|
|
def should_notify?
|
|
!creator.system?
|
|
end
|
|
end
|