Files
fizzy/app/models/notification/pushable.rb
T
Rosa Gutierrez 3621df8f0f Consolidate push jobs into single Notification::PushJob
Replace separate WebPushJob and NativePushJob with a single PushJob
that calls notification.push, which iterates over registered targets.
Each target handles its own delivery - Web pushes synchronously via
the pool, Native enqueues device-level jobs via deliver_later_to.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-25 19:31:13 +01:00

49 lines
1.1 KiB
Ruby

module Notification::Pushable
extend ActiveSupport::Concern
included do
class_attribute :push_targets, default: []
after_create_commit :push_later
after_update_commit :push_later, if: :source_id_previously_changed?
end
class_methods do
def register_push_target(target)
target = resolve_push_target(target)
push_targets << target unless push_targets.include?(target)
end
private
def resolve_push_target(target)
if target.is_a?(Notification::PushTarget) then target
else
"Notification::PushTarget::#{target.to_s.classify}".constantize
end
end
end
def push_later
Notification::PushJob.perform_later(self)
end
def push
self.class.push_targets.each do |target|
target.new(self).push
end
end
def pushable?
!creator.system? && user.active? && account.active?
end
def payload
"Notification::#{payload_type}Payload".constantize.new(self)
end
private
def payload_type
source_type.presence_in(%w[ Event Mention ]) || "Default"
end
end