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.
64 lines
1.5 KiB
Ruby
64 lines
1.5 KiB
Ruby
class Notification < ApplicationRecord
|
|
include PushNotifiable
|
|
|
|
belongs_to :account, default: -> { user.account }
|
|
belongs_to :user
|
|
belongs_to :creator, class_name: "User"
|
|
belongs_to :source, polymorphic: true
|
|
belongs_to :card
|
|
|
|
scope :unread, -> { where(read_at: nil) }
|
|
scope :read, -> { where.not(read_at: nil) }
|
|
scope :ordered, -> { order(read_at: :desc, updated_at: :desc) }
|
|
scope :preloaded, -> { preload(:card, :creator, :account, source: [ :board, :creator, { eventable: [ :closure, :board, :assignments ] } ]) }
|
|
|
|
before_validation :set_card
|
|
after_create :bundle
|
|
after_update :bundle, if: :source_id_previously_changed?
|
|
|
|
after_create_commit -> { broadcast_prepend_later_to user, :notifications, target: "notifications" }
|
|
after_update_commit -> { broadcast_update }
|
|
after_destroy_commit -> { broadcast_remove_to user, :notifications }
|
|
|
|
delegate :notifiable_target, to: :source
|
|
|
|
class << self
|
|
def read_all
|
|
all.each(&:read)
|
|
end
|
|
|
|
def unread_all
|
|
all.each(&:unread)
|
|
end
|
|
end
|
|
|
|
def read
|
|
update!(read_at: Time.current, unread_count: 0)
|
|
end
|
|
|
|
def unread
|
|
update!(read_at: nil, unread_count: 1)
|
|
end
|
|
|
|
def read?
|
|
read_at.present?
|
|
end
|
|
|
|
private
|
|
def set_card
|
|
self.card = source.card
|
|
end
|
|
|
|
def bundle
|
|
user.bundle(self) if user.settings.bundling_emails?
|
|
end
|
|
|
|
def broadcast_update
|
|
if read?
|
|
broadcast_remove_to(user, :notifications)
|
|
else
|
|
broadcast_prepend_later_to(user, :notifications, target: "notifications")
|
|
end
|
|
end
|
|
end
|