From 964d2f85445fa9af35e68c6a03c87f8895b4590b Mon Sep 17 00:00:00 2001 From: Vishnu Narayanan Date: Thu, 22 Jan 2026 17:59:38 +0530 Subject: [PATCH] perf: use account.contacts directly in search to reduce DB load (#12956) - Use resolved contacts instead of accounts.contacts for search --------- Co-authored-by: Muhsin Keloth Co-authored-by: Pranav --- .../api/v1/accounts/contacts_controller.rb | 5 ++--- .../api/v1/accounts/contacts_controller_spec.rb | 12 ------------ 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/app/controllers/api/v1/accounts/contacts_controller.rb b/app/controllers/api/v1/accounts/contacts_controller.rb index e6270c807..86e21d9fd 100644 --- a/app/controllers/api/v1/accounts/contacts_controller.rb +++ b/app/controllers/api/v1/accounts/contacts_controller.rb @@ -24,9 +24,8 @@ class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController def search render json: { error: 'Specify search string with parameter q' }, status: :unprocessable_entity if params[:q].blank? && return - contacts = resolved_contacts.where( - 'name ILIKE :search OR email ILIKE :search OR phone_number ILIKE :search OR contacts.identifier LIKE :search - OR contacts.additional_attributes->>\'company_name\' ILIKE :search', + contacts = Current.account.contacts.where( + 'name ILIKE :search OR email ILIKE :search OR phone_number ILIKE :search OR contacts.identifier LIKE :search', search: "%#{params[:q].strip}%" ) @contacts = fetch_contacts(contacts) diff --git a/spec/controllers/api/v1/accounts/contacts_controller_spec.rb b/spec/controllers/api/v1/accounts/contacts_controller_spec.rb index 5beae6850..8bdc86bb4 100644 --- a/spec/controllers/api/v1/accounts/contacts_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/contacts_controller_spec.rb @@ -357,18 +357,6 @@ RSpec.describe 'Contacts API', type: :request do expect(response.body).not_to include(contact1.email) end - it 'searches contacts using company name' do - contact2.update(additional_attributes: { company_name: 'acme.inc' }) - get "/api/v1/accounts/#{account.id}/contacts/search", - params: { q: 'acme.inc' }, - headers: admin.create_new_auth_token, - as: :json - - expect(response).to have_http_status(:success) - expect(response.body).to include(contact2.email) - expect(response.body).not_to include(contact1.email) - end - it 'matches the resolved contact respecting the identifier character casing' do contact_normal = create(:contact, name: 'testcontact', account: account, identifier: 'testidentifer') contact_special = create(:contact, name: 'testcontact', account: account, identifier: 'TestIdentifier')