98 lines
2.0 KiB
Ruby
98 lines
2.0 KiB
Ruby
class Notification < ApplicationRecord
|
|
|
|
belongs_to :user, counter_cache: true
|
|
belongs_to :notifiable, polymorphic: true
|
|
|
|
validates :user, presence: true
|
|
|
|
scope :read, -> { where.not(read_at: nil).recent.for_render }
|
|
scope :unread, -> { where(read_at: nil).recent.for_render }
|
|
scope :not_emailed, -> { where(emailed_at: nil) }
|
|
scope :recent, -> { order(id: :desc) }
|
|
scope :for_render, -> { includes(:notifiable) }
|
|
|
|
delegate :notifiable_title, :notifiable_body, :notifiable_available?,
|
|
:check_availability, :linkable_resource,
|
|
to: :notifiable, allow_nil: true
|
|
|
|
def mark_as_read
|
|
update(read_at: Time.current)
|
|
end
|
|
|
|
def mark_as_unread
|
|
update(read_at: nil)
|
|
end
|
|
|
|
def read?
|
|
read_at.present?
|
|
end
|
|
|
|
def unread?
|
|
read_at.nil?
|
|
end
|
|
|
|
def timestamp
|
|
notifiable.created_at
|
|
end
|
|
|
|
def self.add(user, notifiable)
|
|
notification = Notification.existent(user, notifiable)
|
|
if notification.present?
|
|
increment_counter(:counter, notification.id)
|
|
else
|
|
create!(user: user, notifiable: notifiable)
|
|
end
|
|
end
|
|
|
|
def self.existent(user, notifiable)
|
|
unread.find_by(user: user, notifiable: notifiable)
|
|
end
|
|
|
|
def notifiable_action
|
|
case notifiable_type
|
|
when "ProposalNotification"
|
|
"proposal_notification"
|
|
when "Comment"
|
|
"replies_to"
|
|
when "AdminNotification"
|
|
nil
|
|
else
|
|
"comments_on"
|
|
end
|
|
end
|
|
|
|
def link
|
|
if notifiable.is_a?(AdminNotification) && notifiable.link.blank?
|
|
nil
|
|
else
|
|
self
|
|
end
|
|
end
|
|
|
|
def self.send_pending
|
|
run_at = first_batch_run_at
|
|
User.email_digest.find_in_batches(batch_size: batch_size) do |users|
|
|
users.each do |user|
|
|
email_digest = EmailDigest.new(user)
|
|
email_digest.deliver(run_at)
|
|
end
|
|
run_at += batch_interval
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def self.batch_size
|
|
10000
|
|
end
|
|
|
|
def self.batch_interval
|
|
20.minutes
|
|
end
|
|
|
|
def self.first_batch_run_at
|
|
Time.current
|
|
end
|
|
|
|
end
|