knowledge_bases_controller.rb 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. class KnowledgeBasesController < KnowledgeBase::BaseController
  3. def init
  4. render json: assets(params[:answer_translation_content_ids])
  5. end
  6. def visible_ids
  7. render json: KnowledgeBase::InternalAssets.new(current_user).visible_ids
  8. end
  9. private
  10. def assets(answer_translation_content_ids = nil)
  11. if KnowledgeBase.granular_permissions?
  12. return granular_assets(answer_translation_content_ids) if kb_permissions?
  13. else
  14. return editor_assets(answer_translation_content_ids) if kb_permission_editor?
  15. return reader_assets(answer_translation_content_ids) if kb_permission_reader?
  16. end
  17. public_assets
  18. end
  19. def kb_permissions?
  20. current_user&.permissions?(%w[knowledge_base.editor knowledge_base.reader])
  21. end
  22. def kb_permission_editor?
  23. current_user&.permissions?('knowledge_base.editor')
  24. end
  25. def kb_permission_reader?
  26. current_user&.permissions?('knowledge_base.reader')
  27. end
  28. def granular_assets(answer_translation_content_ids)
  29. KnowledgeBase::InternalAssets
  30. .new(current_user, answer_translation_content_ids: answer_translation_content_ids)
  31. .collect_assets
  32. end
  33. def editor_assets(answer_translation_content_ids)
  34. assets = [
  35. KnowledgeBase,
  36. KnowledgeBase::Translation,
  37. KnowledgeBase::Locale,
  38. KnowledgeBase::Category,
  39. KnowledgeBase::Category::Translation,
  40. KnowledgeBase::Answer,
  41. KnowledgeBase::Answer::Translation
  42. ].each_with_object({}) do |klass, memo|
  43. klass.find_in_batches do |group|
  44. memo = ApplicationModel::CanAssets.reduce(group, memo, :essential)
  45. end
  46. end
  47. if answer_translation_content_ids.present?
  48. contents = KnowledgeBase::Answer::Translation::Content.where(id: answer_translation_content_ids)
  49. assets = ApplicationModel::CanAssets.reduce(contents, assets)
  50. end
  51. assets
  52. end
  53. def reader_assets(answer_translation_content_ids)
  54. assets = [
  55. KnowledgeBase,
  56. KnowledgeBase::Translation,
  57. KnowledgeBase::Locale,
  58. KnowledgeBase::Category,
  59. KnowledgeBase::Category::Translation
  60. ].each_with_object({}) do |klass, memo|
  61. klass.find_in_batches do |group|
  62. memo = ApplicationModel::CanAssets.reduce(group, memo, :essential)
  63. end
  64. end
  65. KnowledgeBase::Answer.internal.find_in_batches do |group|
  66. assets = ApplicationModel::CanAssets.reduce group, assets, :essential
  67. translations = KnowledgeBase::Answer::Translation.where(answer_id: group.pluck(:id))
  68. assets = ApplicationModel::CanAssets.reduce(translations, assets, :essential)
  69. if answer_translation_content_ids.present?
  70. contents = KnowledgeBase::Answer::Translation::Content
  71. .joins(:translation)
  72. .where(
  73. id: answer_translation_content_ids,
  74. knowledge_base_answer_translations: { answer_id: group }
  75. )
  76. assets = ApplicationModel::CanAssets.reduce(contents, assets)
  77. end
  78. end
  79. assets
  80. end
  81. # assets for users who don't have KB permissions
  82. def public_assets
  83. return [] if !Setting.get('kb_active_publicly')
  84. ApplicationModel::CanAssets.reduce(KnowledgeBase.active, {}, :public)
  85. end
  86. end