checks_kb_client_notification_job.rb 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. # Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
  2. class ChecksKbClientNotificationJob < ApplicationJob
  3. include HasActiveJobLock
  4. def lock_key
  5. # "ChecksKbClientNotificationJob/KnowledgeBase::Answer/42/destroy"
  6. "#{self.class.name}/#{arguments[0]}/#{arguments[1]}/#{arguments[2]}"
  7. end
  8. def perform(klass_name, id, event)
  9. object = klass_name.constantize.find_by(id: id)
  10. return if object.blank?
  11. level = needs_editor?(object) ? 'editor' : '*'
  12. payload = {
  13. event: 'kb_data_changed',
  14. data: build_data(object, event)
  15. }
  16. users_for(level).each { |user| notify(user, payload) }
  17. end
  18. def build_data(object, event)
  19. timestamp = event == :destroy ? Time.zone.now : object.updated_at
  20. url = event == :destroy ? nil : object.api_url
  21. {
  22. class: object.class.to_s,
  23. event: event,
  24. id: object.id,
  25. timestamp: timestamp,
  26. url: url
  27. }
  28. end
  29. def needs_editor?(object)
  30. case object
  31. when KnowledgeBase::Answer
  32. object.can_be_published_aasm.draft?
  33. when KnowledgeBase::Category
  34. !object.internal_content?
  35. else
  36. false
  37. end
  38. end
  39. def notify(user, payload)
  40. PushMessages.send_to(user.id, payload)
  41. end
  42. def users_for(permission_suffix)
  43. Sessions
  44. .sessions
  45. .filter_map { |client_id| Sessions.get(client_id)&.dig(:user, 'id') }
  46. .filter_map { |user_id| User.find_by(id: user_id) }
  47. .select { |user| user.permissions? "knowledge_base.#{permission_suffix}" }
  48. end
  49. def self.notify_later(object, event)
  50. perform_later(object.class.to_s, object.id, event.to_s)
  51. end
  52. end