search_controller.rb 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. class KnowledgeBase::SearchController < ApplicationController
  2. skip_before_action :verify_csrf_token
  3. #skip_before_action :verify_authenticity_token
  4. include KnowledgeBaseHelper
  5. include ActionView::Helpers::SanitizeHelper
  6. # POST /api/v1/knowledge_bases/search
  7. # knowledge_base_id, locale, flavor, index, limit, include_locale
  8. def search
  9. knowledge_base = KnowledgeBase
  10. .active
  11. .find_by id: params[:knowledge_base_id]
  12. kb_locale = knowledge_base
  13. &.kb_locales
  14. &.joins(:system_locale)
  15. &.find_by(locales: { locale: params[:locale] })
  16. scope = knowledge_base
  17. &.categories
  18. &.find_by(id: params[:scope_id])
  19. search_backend = SearchKnowledgeBaseBackend.new(
  20. knowledge_base: knowledge_base,
  21. locale: kb_locale,
  22. scope: scope,
  23. flavor: params[:flavor],
  24. index: params[:index],
  25. limit: params[:limit],
  26. highlight_enabled: params[:highlight_enabled]
  27. )
  28. include_locale = params[:include_locale] && KnowledgeBase.with_multiple_locales_exists?
  29. result = search_backend.search params[:query], user: current_user
  30. if (exclude_ids = params[:exclude_ids]&.map(&:to_i))
  31. result.reject! { |meta| meta[:type] == params[:index] && exclude_ids.include?(meta[:id]) }
  32. end
  33. details = result.map { |item| public_item_details(item, include_locale) }
  34. render json: {
  35. result: result,
  36. details: details,
  37. }
  38. end
  39. private
  40. def item_assets(meta)
  41. object = meta[:type].constantize.find(meta[:id])
  42. object.assets
  43. end
  44. def public_item_details(meta, include_locale)
  45. object = meta[:type].constantize.find(meta[:id])
  46. output = case object
  47. when KnowledgeBase::Answer::Translation
  48. public_item_details_answer(meta, object)
  49. when KnowledgeBase::Category::Translation
  50. public_item_details_category(meta, object)
  51. when KnowledgeBase::Translation
  52. public_item_details_base(meta, object)
  53. end
  54. if include_locale && (system_locale = object.kb_locale.system_locale)
  55. output[:title] += " (#{system_locale.name})"
  56. end
  57. output
  58. end
  59. def public_item_details_answer(meta, object)
  60. category_translation = object.answer.category.translation_to(object.kb_locale)
  61. path = help_answer_path(category_translation, object, locale: object.kb_locale.system_locale.locale)
  62. url = case url_type
  63. when :public
  64. custom_path_if_needed(path, object.answer.category.knowledge_base)
  65. when :agent
  66. knowledge_base_answer_path(object.answer.category.knowledge_base, object.answer) + "?include_contents=#{object.id}"
  67. end
  68. {
  69. id: object.id,
  70. type: object.class.name,
  71. icon: 'knowledge-base-answer',
  72. date: object.updated_at,
  73. url: url,
  74. title: meta.dig(:highlight, 'title')&.first || object.title,
  75. subtitle: strip_tags(category_translation.title),
  76. body: meta.dig(:highlight, 'content.body')&.first || strip_tags(object.content.body).truncate(100)
  77. }
  78. end
  79. def public_item_details_category(meta, object)
  80. parent_category_translation = object.category.parent&.translation_to(object.kb_locale)
  81. path = help_category_path(object, locale: object.kb_locale.system_locale.locale)
  82. url = case url_type
  83. when :public
  84. custom_path_if_needed(path, object.category.knowledge_base)
  85. when :agent
  86. knowledge_base_category_path(object.category.knowledge_base, object.category)
  87. end
  88. {
  89. id: object.id,
  90. type: object.class.name,
  91. fontName: object.category.knowledge_base.iconset,
  92. date: object.updated_at,
  93. url: url,
  94. icon: object.category.category_icon,
  95. subtitle: strip_tags(parent_category_translation&.title.presence),
  96. title: meta.dig(:highlight, 'title')&.first || strip_tags(object.title)
  97. }
  98. end
  99. def public_item_details_base(meta, object)
  100. path = help_root_path(object.kb_locale.system_locale.locale)
  101. url = case url_type
  102. when :public
  103. custom_path_if_needed(path, object.knowledge_base)
  104. when :agent
  105. knowledge_base_path(object.knowledge_base)
  106. end
  107. {
  108. id: object.id,
  109. type: object.class.name,
  110. icon: 'knowledge-base',
  111. date: object.updated_at,
  112. url: url,
  113. title: meta.dig(:highlight, 'title')&.first || strip_tags(object.title)
  114. }
  115. end
  116. def url_type
  117. params[:url_type]&.to_sym || :public
  118. end
  119. end