Files
fizzy/app/models/card/readable.rb
T
Jeremy Daer f440b0243e Tighten scope on card notification removals
* Iterate each association separately to favor db indexing
* Pluck user IDs rather than select to avoid correlated subquery
2025-12-03 15:46:43 -08:00

64 lines
1.6 KiB
Ruby

module Card::Readable
extend ActiveSupport::Concern
def read_by(user)
notifications_for(user).tap do |notifications|
notifications.each(&:read)
end
end
def unread_by(user)
all_notifications_for(user).tap do |notifications|
notifications.each(&:unread)
end
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 notifications_for(user)
scope = user.notifications.unread
scope.where(source: event_notification_sources)
.or(scope.where(source: mention_notification_sources))
end
def all_notifications_for(user)
scope = user.notifications
scope.where(source: event_notification_sources)
.or(scope.where(source: mention_notification_sources))
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