checks_kb_client_notification_job.rb 1.4 KB

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