knowledge_bases_controller.rb 2.7 KB

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