Using 'try' method to get notifiable is not working with translations anymore. It was returning 'nil' always even when body translation is populated.
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.where(user: user, notifiable: notifiable).first
|
|
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
|