knowledge_bases_controller.rb 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. # Copyright (C) 2012-2017 Zammad Foundation, http://zammad-foundation.org/
  2. class KnowledgeBasesController < KnowledgeBase::BaseController
  3. def init
  4. render json: assets(params[:answer_translation_content_ids])
  5. end
  6. private
  7. def assets(answer_translation_content_ids = nil)
  8. return editor_assets(answer_translation_content_ids) if current_user&.permissions?('knowledge_base.editor')
  9. return reader_assets(answer_translation_content_ids) if current_user&.permissions?('knowledge_base.reader')
  10. public_assets
  11. end
  12. def editor_assets(answer_translation_content_ids)
  13. assets = [
  14. KnowledgeBase,
  15. KnowledgeBase::Translation,
  16. KnowledgeBase::Locale,
  17. KnowledgeBase::Category,
  18. KnowledgeBase::Category::Translation,
  19. KnowledgeBase::Answer,
  20. KnowledgeBase::Answer::Translation
  21. ].each_with_object({}) do |klass, memo|
  22. klass.find_in_batches do |group|
  23. memo = ApplicationModel::CanAssets.reduce(group, memo, :essential)
  24. end
  25. end
  26. if answer_translation_content_ids.present?
  27. contents = KnowledgeBase::Answer::Translation::Content.where(id: answer_translation_content_ids)
  28. assets = ApplicationModel::CanAssets.reduce(contents, assets)
  29. end
  30. assets
  31. end
  32. def reader_assets(answer_translation_content_ids)
  33. assets = [
  34. KnowledgeBase,
  35. KnowledgeBase::Translation,
  36. KnowledgeBase::Locale,
  37. KnowledgeBase::Category,
  38. KnowledgeBase::Category::Translation
  39. ].each_with_object({}) do |klass, memo|
  40. klass.find_in_batches do |group|
  41. memo = ApplicationModel::CanAssets.reduce(group, memo, :essential)
  42. end
  43. end
  44. KnowledgeBase::Answer.internal.find_in_batches do |group|
  45. assets = ApplicationModel::CanAssets.reduce group, assets, :essential
  46. translations = KnowledgeBase::Answer::Translation.where(answer_id: group.pluck(:id))
  47. assets = ApplicationModel::CanAssets.reduce(translations, assets, :essential)
  48. if answer_translation_content_ids.present?
  49. contents = KnowledgeBase::Answer::Translation::Content
  50. .joins(:translation)
  51. .where(
  52. id: answer_translation_content_ids,
  53. knowledge_base_answer_translations: { answer_id: group }
  54. )
  55. assets = ApplicationModel::CanAssets.reduce(contents, assets)
  56. end
  57. end
  58. assets
  59. end
  60. # assets for users who don't have KB permissions
  61. def public_assets
  62. return [] if !Setting.get('kb_active_publicly')
  63. ApplicationModel::CanAssets.reduce(KnowledgeBase.active, {}, :public)
  64. end
  65. end