123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- module ChecksClientNotification
- extend ActiveSupport::Concern
- included do
- after_create :notify_clients_after_create
- after_update :notify_clients_after_update
- after_touch :notify_clients_after_touch
- after_destroy :notify_clients_after_destroy
- end
- def notify_clients_data(event)
- class_name = self.class.name.gsub(%r{::}, '')
- {
- message: {
- event: "#{class_name}:#{event}",
- data: notify_clients_data_attributes
- },
- type: client_notification_send_type,
- }
- end
- def notify_clients_data_attributes
- {
- id: id,
- updated_at: updated_at
- }
- end
- def notify_clients_send(data)
- return notify_clients_send_to(data[:message]) if client_notification_send_to.present?
- PushMessages.send(data)
- end
- def notify_clients_send_to(data)
- client_notification_send_to.each do |user_id|
- PushMessages.send_to(send(user_id), data)
- end
- end
- def notify_clients_after_create
- # return if we run import mode
- return if Setting.get('import_mode')
- # skip if ignored
- return if client_notification_events_ignored.include?(:create)
- logger.debug { "#{self.class.name}.find(#{id}) notify created #{created_at}" }
- data = notify_clients_data(:create)
- notify_clients_send(data)
- end
- def notify_clients_after_update
- # return if we run import mode
- return if Setting.get('import_mode')
- # skip if ignored
- return if client_notification_events_ignored.include?(:update)
- logger.debug { "#{self.class.name}.find(#{id}) notify UPDATED #{updated_at}" }
- data = notify_clients_data(:update)
- notify_clients_send(data)
- end
- def notify_clients_after_touch
- # return if we run import mode
- return if Setting.get('import_mode')
- # skip if ignored
- return if client_notification_events_ignored.include?(:touch)
- logger.debug { "#{self.class.name}.find(#{id}) notify TOUCH #{updated_at}" }
- data = notify_clients_data(:touch)
- notify_clients_send(data)
- end
- def notify_clients_after_destroy
- # return if we run import mode
- return if Setting.get('import_mode')
- # skip if ignored
- return if client_notification_events_ignored.include?(:destroy)
- logger.debug { "#{self.class.name}.find(#{id}) notify DESTOY #{updated_at}" }
- data = notify_clients_data(:destroy)
- notify_clients_send(data)
- end
- private
- def client_notification_events_ignored
- @client_notification_events_ignored ||= self.class.instance_variable_get(:@client_notification_events_ignored) || []
- end
- def client_notification_send_to
- @client_notification_send_to ||= self.class.instance_variable_get(:@client_notification_send_to) || []
- end
- def client_notification_send_type
- @client_notification_send_type ||= self.class.instance_variable_get(:@client_notification_send_type) || 'authenticated'
- end
- # methods defined here are going to extend the class, not the instance of it
- class_methods do
- # serve method to ignore events
- #
- # @example
- # class Model < ApplicationModel
- # include ChecksClientNotification
- # client_notification_events_ignored :create, :update, :touch
- # end
- def client_notification_events_ignored(*attributes)
- @client_notification_events_ignored ||= []
- @client_notification_events_ignored |= attributes
- end
- # serve method to define recipient user ids
- #
- # @example
- # class Model < ApplicationModel
- # include ChecksClientNotification
- # client_notification_send_to :user_id
- # end
- def client_notification_send_to(*attributes)
- @client_notification_send_to ||= []
- @client_notification_send_to |= attributes
- end
- def client_notification_send_type(type)
- @client_notification_send_type = type
- end
- end
- end
|