categories_controller.rb 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. # Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
  2. class KnowledgeBase::CategoriesController < KnowledgeBase::BaseController
  3. before_action :load_knowledge_base, only: %i[reorder_root_categories reorder_categories reorder_answers]
  4. def reorder_root_categories
  5. reorder_records @knowledge_base.categories.root, params[:ordered_ids], KnowledgeBase::Category
  6. end
  7. def reorder_categories
  8. reorder_records @category.children, params[:ordered_ids], KnowledgeBase::Category
  9. end
  10. def reorder_answers
  11. reorder_records @category.answers, params[:ordered_ids], KnowledgeBase::Answer
  12. end
  13. private
  14. def reorder_records(collection, ids, klass)
  15. # Check if ids for models in collection are present
  16. all_ids_present = collection.map(&:id).sort == ids.sort
  17. raise Exceptions::UnprocessableEntity, __('Provide position of all items in scope') if !all_ids_present
  18. klass.notify_kb_clients_suspend = true
  19. klass.acts_as_list_no_update do
  20. ids.each_with_index do |id, index|
  21. collection
  22. .find { |item| item.id == id }
  23. .update!(position: index)
  24. end
  25. end
  26. klass.notify_kb_clients_suspend = false
  27. # it's enough to notify about one updated item
  28. collection.first.touch # rubocop:disable Rails/SkipsModelValidations
  29. assets = ApplicationModel::CanAssets.reduce(collection, {})
  30. render json: assets
  31. end
  32. def load_knowledge_base
  33. @knowledge_base = KnowledgeBase.find params[:knowledge_base_id]
  34. @category = @knowledge_base.categories.find params[:id] if params.key? :id
  35. end
  36. end