36ee253a1a
We had client-side notification stacking in the tray since launch, but now we want to stack notifications in the notifications page, in API responses and in email bundles.
48 lines
1.2 KiB
Ruby
48 lines
1.2 KiB
Ruby
module Card::Readable
|
|
extend ActiveSupport::Concern
|
|
|
|
def read_by(user)
|
|
user.notifications.find_by(card: self)&.read
|
|
end
|
|
|
|
def unread_by(user)
|
|
user.notifications.find_by(card: self)&.unread
|
|
end
|
|
|
|
def remove_inaccessible_notifications
|
|
accessible_user_ids = board.accesses.pluck(:user_id)
|
|
notification_sources.each do |sources|
|
|
inaccessible_notifications_from(sources, accessible_user_ids).in_batches.destroy_all
|
|
end
|
|
end
|
|
|
|
private
|
|
def remove_inaccessible_notifications_later
|
|
Card::RemoveInaccessibleNotificationsJob.perform_later(self)
|
|
end
|
|
|
|
def event_notification_sources
|
|
events.or(comment_creation_events)
|
|
end
|
|
|
|
def comment_creation_events
|
|
Event.where(eventable: comments)
|
|
end
|
|
|
|
def inaccessible_notifications_from(sources, accessible_user_ids)
|
|
Notification.where(source: sources).where.not(user_id: accessible_user_ids)
|
|
end
|
|
|
|
def notification_sources
|
|
[ events, comment_creation_events, mentions, comment_mentions ]
|
|
end
|
|
|
|
def mention_notification_sources
|
|
mentions.or(comment_mentions)
|
|
end
|
|
|
|
def comment_mentions
|
|
Mention.where(source: comments)
|
|
end
|
|
end
|