From eadbddaa9f5ccca48f23f689972057488baa03de Mon Sep 17 00:00:00 2001 From: Pranav Date: Wed, 24 Sep 2025 01:41:15 -0700 Subject: [PATCH] feat: Separate indexing with the search feature (#12503) With this change, the indexing would be separate from the search, so you need to enable indexing on the cloud and run it. It should start indexing the messages to ElasticSearch/OpenSearch. Once indexing is completed, we can turn on the feature for the customer. Make sure that the following is done when you deploy. Set POSTGRES_STATEMENT_TIMEOUT=600s before you run the indexing. 1. Make sure that the account with advanced_search has advanced_search_indexing enabled ```rb Account.feature_advanced_search.each do |account| account.enable_features(:advanced_search_indexing) account.save! end ``` 2. Enable indexing for all accounts with paid subscription. ```rb Account.where("custom_attributes ->> 'plan_name' IN (?)", ['Enterprise', 'Startups', 'Business']).each do |account| account.enable_features(:advanced_search_indexing) account.save! end ``` 3. Run indexing for all the messages. ```rb Message.reindex ``` Co-authored-by: Vishnu Narayanan Co-authored-by: Muhsin Keloth --- app/models/message.rb | 10 +++++++++- config/features.yml | 5 +++++ .../billing/handle_stripe_event_service.rb | 1 + spec/models/message_spec.rb | 18 +++++++++++++++--- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/app/models/message.rb b/app/models/message.rb index 06be665d8..dbab19df3 100644 --- a/app/models/message.rb +++ b/app/models/message.rb @@ -244,8 +244,16 @@ class Message < ApplicationRecord def should_index? return false unless ChatwootApp.advanced_search_allowed? - return false unless account.feature_enabled?('advanced_search') return false unless incoming? || outgoing? + # For Chatwoot Cloud: + # - Enable indexing only if the account is paid. + # - The `advanced_search_indexing` feature flag is used only in the cloud. + # + # For Self-hosted: + # - Adding an extra feature flag here would cause confusion. + # - If the user has configured Elasticsearch, enabling `advanced_search` + # should automatically work without any additional flags. + return false if ChatwootApp.chatwoot_cloud? && !account.feature_enabled?('advanced_search_indexing') true end diff --git a/config/features.yml b/config/features.yml index 181284784..40083812a 100644 --- a/config/features.yml +++ b/config/features.yml @@ -209,3 +209,8 @@ display_name: SAML enabled: false premium: true +- name: advanced_search_indexing + display_name: Advanced Search Indexing + enabled: false + premium: true + chatwoot_internal: true diff --git a/enterprise/app/services/enterprise/billing/handle_stripe_event_service.rb b/enterprise/app/services/enterprise/billing/handle_stripe_event_service.rb index a21afff3c..18dc9e69f 100644 --- a/enterprise/app/services/enterprise/billing/handle_stripe_event_service.rb +++ b/enterprise/app/services/enterprise/billing/handle_stripe_event_service.rb @@ -15,6 +15,7 @@ class Enterprise::Billing::HandleStripeEventService channel_email channel_instagram captain_integration + advanced_search_indexing ].freeze # Additional features available starting with the Business plan diff --git a/spec/models/message_spec.rb b/spec/models/message_spec.rb index 2234c1ad6..a0bd48e39 100644 --- a/spec/models/message_spec.rb +++ b/spec/models/message_spec.rb @@ -621,7 +621,7 @@ RSpec.describe Message do before do allow(ChatwootApp).to receive(:advanced_search_allowed?).and_return(true) - account.enable_features('advanced_search') + account.enable_features('advanced_search_indexing') end context 'when advanced search is not allowed globally' do @@ -634,9 +634,10 @@ RSpec.describe Message do end end - context 'when advanced search feature is not enabled for account' do + context 'when advanced search feature is not enabled for account on chatwoot cloud' do before do - account.disable_features('advanced_search') + allow(ChatwootApp).to receive(:chatwoot_cloud?).and_return(true) + account.disable_features('advanced_search_indexing') end it 'returns false' do @@ -644,6 +645,17 @@ RSpec.describe Message do end end + context 'when advanced search feature is not enabled for account on self-hosted' do + before do + allow(ChatwootApp).to receive(:chatwoot_cloud?).and_return(false) + account.disable_features('advanced_search_indexing') + end + + it 'returns true' do + expect(message.should_index?).to be true + end + end + context 'when message type is not incoming or outgoing' do before do message.message_type = 'activity'