mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-30 18:47:51 +00:00 
			
		
		
		
	 fc7b84d612
			
		
	
	fc7b84d612
	
	
	
		
			
			* Chore: Fix N+1 queries in dashboard side Fixed a couple of N+1 queries fired on the dashboard side of the app to improve performance.
		
			
				
	
	
		
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| class Api::V1::Accounts::ContactsController < Api::V1::Accounts::BaseController
 | |
|   protect_from_forgery with: :null_session
 | |
| 
 | |
|   before_action :check_authorization
 | |
|   before_action :fetch_contact, only: [:show, :update]
 | |
| 
 | |
|   def index
 | |
|     @contacts = Current.account.contacts
 | |
|   end
 | |
| 
 | |
|   def show; end
 | |
| 
 | |
|   def create
 | |
|     ActiveRecord::Base.transaction do
 | |
|       @contact = Current.account.contacts.new(contact_params)
 | |
|       @contact.save!
 | |
|       @contact_inbox = build_contact_inbox
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def update
 | |
|     @contact.update!(contact_update_params)
 | |
|   rescue ActiveRecord::RecordInvalid => e
 | |
|     render json: {
 | |
|       message: e.record.errors.full_messages.join(', '),
 | |
|       contact: Contact.find_by(email: contact_params[:email])
 | |
|     }, status: :unprocessable_entity
 | |
|   end
 | |
| 
 | |
|   def search
 | |
|     render json: { error: 'Specify search string with parameter q' }, status: :unprocessable_entity if params[:q].blank? && return
 | |
| 
 | |
|     @contacts = Current.account.contacts.where('name LIKE :search OR email LIKE :search', search: "%#{params[:q]}%")
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def check_authorization
 | |
|     authorize(Contact)
 | |
|   end
 | |
| 
 | |
|   def build_contact_inbox
 | |
|     return if params[:inbox_id].blank?
 | |
| 
 | |
|     inbox = Current.account.inboxes.find(params[:inbox_id])
 | |
|     source_id = params[:source_id] || SecureRandom.uuid
 | |
|     ContactInbox.create(contact: @contact, inbox: inbox, source_id: source_id)
 | |
|   end
 | |
| 
 | |
|   def contact_params
 | |
|     params.require(:contact).permit(:name, :email, :phone_number, additional_attributes: {}, custom_attributes: {})
 | |
|   end
 | |
| 
 | |
|   def contact_custom_attributes
 | |
|     return @contact.custom_attributes.merge(contact_params[:custom_attributes]) if contact_params[:custom_attributes]
 | |
| 
 | |
|     @contact.custom_attributes
 | |
|   end
 | |
| 
 | |
|   def contact_update_params
 | |
|     # we want the merged custom attributes not the original one
 | |
|     contact_params.except(:custom_attributes).merge({ custom_attributes: contact_custom_attributes })
 | |
|   end
 | |
| 
 | |
|   def fetch_contact
 | |
|     @contact = Current.account.contacts.includes(contact_inboxes: [:inbox]).find(params[:id])
 | |
|   end
 | |
| end
 |