checks_kb_client_notification_job.rb 1.6 KB

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