internal_assets.rb 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. # Copyright (C) 2012-2022 Zammad Foundation, https://zammad-foundation.org/
  2. class KnowledgeBase
  3. class InternalAssets
  4. CategoriesCache = Struct.new(:editor, :reader, :public_reader, keyword_init: true) do
  5. def all
  6. editor + reader + public_reader
  7. end
  8. end
  9. attr_reader :assets
  10. def initialize(user, answer_translation_content_ids: [])
  11. @user = user
  12. @assets = {}
  13. @answer_translation_content_ids = answer_translation_content_ids
  14. end
  15. def collect_assets
  16. collect_base_assets
  17. add_to_assets accessible_categories.all, type: :essential
  18. add_to_assets KnowledgeBase::Category::Translation.where(category: accessible_categories.all)
  19. collect_all_answer_assets
  20. @assets
  21. end
  22. def accessible_categories
  23. @accessible_categories ||= accessible_categories_calculate
  24. end
  25. def all_answer_ids
  26. all_answer_batches.each_with_object([]) do |elem, sum|
  27. sum.concat elem.pluck(:id)
  28. end
  29. end
  30. def all_category_ids
  31. accessible_categories.all.pluck(:id)
  32. end
  33. def visible_ids
  34. {
  35. answer_ids: all_answer_ids,
  36. category_ids: all_category_ids
  37. }
  38. end
  39. private
  40. def accessible_categories_calculate
  41. struct = CategoriesCache.new editor: [], reader: [], public_reader: []
  42. KnowledgeBase::Category.all.find_in_batches do |group|
  43. group.each do |cat|
  44. case KnowledgeBase::EffectivePermission.new(@user, cat).access_effective
  45. when 'editor'
  46. struct.editor << cat
  47. when 'reader'
  48. struct.reader << cat if cat.internal_content?
  49. when 'public_reader'
  50. struct.public_reader << cat if cat.public_content?
  51. end
  52. end
  53. end
  54. struct
  55. end
  56. def add_to_assets(objects, type: nil)
  57. @assets = ApplicationModel::CanAssets.reduce(objects, @assets, type)
  58. end
  59. def collect_base_assets
  60. [KnowledgeBase, KnowledgeBase::Translation, KnowledgeBase::Locale]
  61. .each do |klass|
  62. klass.find_in_batches do |group|
  63. add_to_assets group, type: :essential
  64. end
  65. end
  66. end
  67. def all_answer_batches
  68. [
  69. KnowledgeBase::Answer.where(category: accessible_categories.editor),
  70. KnowledgeBase::Answer.internal.where(category: accessible_categories.reader),
  71. KnowledgeBase::Answer.published.where(category: accessible_categories.public_reader)
  72. ]
  73. end
  74. def collect_all_answer_assets
  75. all_answer_batches.each do |batch|
  76. collect_answers_assets batch
  77. end
  78. end
  79. def collect_answers_assets(scope)
  80. scope.find_in_batches do |group|
  81. add_to_assets group, type: :essential
  82. translations = KnowledgeBase::Answer::Translation.where(answer: group)
  83. add_to_assets translations, type: :essential
  84. if @answer_translation_content_ids.present?
  85. contents = KnowledgeBase::Answer::Translation::Content
  86. .joins(:translation)
  87. .where(
  88. id: @answer_translation_content_ids,
  89. knowledge_base_answer_translations: { answer_id: group }
  90. )
  91. add_to_assets contents
  92. end
  93. end
  94. end
  95. end
  96. end