From 35852ef6ab7deb2568e7a53628ce2060a0b64ff9 Mon Sep 17 00:00:00 2001 From: Pete Matsyburka Date: Sat, 21 Jun 2025 22:52:10 +0300 Subject: [PATCH] add onprem search reindex --- .../search_entries_reindex_controller.rb | 17 +++++++++++++++++ app/controllers/setup_controller.rb | 1 + .../submitters_autocomplete_controller.rb | 2 +- app/jobs/reindex_all_search_entries_job.rb | 9 +++++++++ app/views/accounts/show.html.erb | 8 ++++++++ config/routes.rb | 1 + lib/docuseal.rb | 15 +++++++++------ lib/submissions.rb | 2 +- lib/submitters.rb | 2 +- lib/templates.rb | 2 +- 10 files changed, 49 insertions(+), 10 deletions(-) create mode 100644 app/controllers/search_entries_reindex_controller.rb create mode 100644 app/jobs/reindex_all_search_entries_job.rb diff --git a/app/controllers/search_entries_reindex_controller.rb b/app/controllers/search_entries_reindex_controller.rb new file mode 100644 index 00000000..afbe60b2 --- /dev/null +++ b/app/controllers/search_entries_reindex_controller.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +class SearchEntriesReindexController < ApplicationController + def create + authorize!(:manage, EncryptedConfig) + + ReindexAllSearchEntriesJob.perform_async + + AccountConfig.find_or_initialize_by(account_id: Account.minimum(:id), key: :fulltext_search) + .update!(value: true) + + Docuseal.instance_variable_set(:@fulltext_search, nil) + + redirect_back(fallback_location: settings_account_path, + notice: "Started building search index. Visit #{root_url}jobs/busy to check progress.") + end +end diff --git a/app/controllers/setup_controller.rb b/app/controllers/setup_controller.rb index 9b49b1f8..778255bc 100644 --- a/app/controllers/setup_controller.rb +++ b/app/controllers/setup_controller.rb @@ -34,6 +34,7 @@ class SetupController < ApplicationController { key: EncryptedConfig::ESIGN_CERTS_KEY, value: GenerateCertificate.call.transform_values(&:to_pem) } ] @account.encrypted_configs.create!(encrypted_configs) + @account.account_configs.create!(key: :fulltext_search, value: true) if SearchEntry.table_exists? Docuseal.refresh_default_url_options! diff --git a/app/controllers/submitters_autocomplete_controller.rb b/app/controllers/submitters_autocomplete_controller.rb index 70f02747..efbb110a 100644 --- a/app/controllers/submitters_autocomplete_controller.rb +++ b/app/controllers/submitters_autocomplete_controller.rb @@ -22,7 +22,7 @@ class SubmittersAutocompleteController < ApplicationController def search_submitters(submitters) if SELECT_COLUMNS.include?(params[:field]) - if Docuseal.fulltext_search?(current_user) + if Docuseal.fulltext_search? Submitters.fulltext_search_field(current_user, submitters, params[:q], params[:field]) else column = Submitter.arel_table[params[:field].to_sym] diff --git a/app/jobs/reindex_all_search_entries_job.rb b/app/jobs/reindex_all_search_entries_job.rb new file mode 100644 index 00000000..0960bcdd --- /dev/null +++ b/app/jobs/reindex_all_search_entries_job.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +class ReindexAllSearchEntriesJob + include Sidekiq::Job + + def perform + SearchEntries.reindex_all + end +end diff --git a/app/views/accounts/show.html.erb b/app/views/accounts/show.html.erb index 2f8fa96e..e52fa321 100644 --- a/app/views/accounts/show.html.erb +++ b/app/views/accounts/show.html.erb @@ -165,6 +165,14 @@ <% end %> <% end %> <% end %> + <% if !Docuseal.multitenant? && SearchEntry.table_exists? && (!Docuseal.fulltext_search? || params[:reindex] == 'true') && can?(:manage, EncryptedConfig) %> +
+ + Efficient search with search index + + <%= button_to params[:reindex] == 'true' ? 'Reindex' : 'Build Search Index', settings_search_entries_reindex_index_path, method: :post, class: 'btn btn-sm btn-neutral text-white px-4' %> +
+ <% end %> <% end %> <%= render 'compliances' %> diff --git a/config/routes.rb b/config/routes.rb index aed50953..39cebbea 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -163,6 +163,7 @@ Rails.application.routes.draw do scope '/settings', as: :settings do unless Docuseal.multitenant? resources :storage, only: %i[index create], controller: 'storage_settings' + resources :search_entries_reindex, only: %i[create] resources :sms, only: %i[index], controller: 'sms_settings' end resources :email, only: %i[index create], controller: 'email_smtp_settings' diff --git a/lib/docuseal.rb b/lib/docuseal.rb index 77d28a5e..23c02271 100644 --- a/lib/docuseal.rb +++ b/lib/docuseal.rb @@ -73,12 +73,15 @@ module Docuseal @default_pkcs ||= GenerateCertificate.load_pkcs(Docuseal::CERTS) end - def fulltext_search?(_user) - return false unless SearchEntry.table_exists? - return true if Docuseal.multitenant? - return true if Rails.env.local? - - false + def fulltext_search? + return @fulltext_search unless @fulltext_search.nil? + + @fulltext_search = + if SearchEntry.table_exists? + Docuseal.multitenant? ? true : AccountConfig.exists?(key: :fulltext_search, value: true) + else + false + end end def enable_pwa? diff --git a/lib/submissions.rb b/lib/submissions.rb index 2ba84731..0fb3b0e0 100644 --- a/lib/submissions.rb +++ b/lib/submissions.rb @@ -8,7 +8,7 @@ module Submissions module_function def search(current_user, submissions, keyword, search_values: false, search_template: false) - if Docuseal.fulltext_search?(current_user) + if Docuseal.fulltext_search? fulltext_search(current_user, submissions, keyword, search_template:) else plain_search(submissions, keyword, search_values:, search_template:) diff --git a/lib/submitters.rb b/lib/submitters.rb index 930332ac..65bc4215 100644 --- a/lib/submitters.rb +++ b/lib/submitters.rb @@ -14,7 +14,7 @@ module Submitters module_function def search(current_user, submitters, keyword) - if Docuseal.fulltext_search?(current_user) + if Docuseal.fulltext_search? fulltext_search(current_user, submitters, keyword) else plain_search(submitters, keyword) diff --git a/lib/templates.rb b/lib/templates.rb index aa476493..95033f02 100644 --- a/lib/templates.rb +++ b/lib/templates.rb @@ -38,7 +38,7 @@ module Templates end def search(current_user, templates, keyword) - if Docuseal.fulltext_search?(current_user) + if Docuseal.fulltext_search? fulltext_search(current_user, templates, keyword) else plain_search(templates, keyword)