mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 11:08:04 +00:00 
			
		
		
		
	 c88447c11f
			
		
	
	c88447c11f
	
	
	
		
			
			At the moment, when updating the inbox members, or team members the account cache used for IndexedDB is not invalidated. This can cause inconsistencies in the UI. This PR fixes this by adding explicit invalidation after performing the member changes ### Summary of changes 1. Added a new method `add_members` and `remove_members` to both `team` and `inbox` models. The change was necessary for two reasons - Since the individual `add_member` and `remove_member` is called in a loop, it's wasteful to run the cache invalidation in the method. - Moving the account cache invalidation call in the controller pollutes the controller business logic 2. Updated tests across the board ### More improvements We can make a concern called `Memberable` with usage like `memberable_with :inbox_members`, that can encapsulate the functionality --- Related: https://github.com/chatwoot/chatwoot/issues/10578
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| class Api::V1::Accounts::InboxMembersController < Api::V1::Accounts::BaseController
 | |
|   before_action :fetch_inbox
 | |
|   before_action :current_agents_ids, only: [:create, :update]
 | |
| 
 | |
|   def show
 | |
|     authorize @inbox, :show?
 | |
|     fetch_updated_agents
 | |
|   end
 | |
| 
 | |
|   def create
 | |
|     authorize @inbox, :create?
 | |
|     ActiveRecord::Base.transaction do
 | |
|       @inbox.add_members(agents_to_be_added_ids)
 | |
|     end
 | |
|     fetch_updated_agents
 | |
|   end
 | |
| 
 | |
|   def update
 | |
|     authorize @inbox, :update?
 | |
|     update_agents_list
 | |
|     fetch_updated_agents
 | |
|   end
 | |
| 
 | |
|   def destroy
 | |
|     authorize @inbox, :destroy?
 | |
|     ActiveRecord::Base.transaction do
 | |
|       @inbox.remove_members(params[:user_ids])
 | |
|     end
 | |
|     head :ok
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def fetch_updated_agents
 | |
|     @agents = Current.account.users.where(id: @inbox.members.select(:user_id))
 | |
|   end
 | |
| 
 | |
|   def update_agents_list
 | |
|     # get all the user_ids which the inbox currently has as members.
 | |
|     # get the list of  user_ids from params
 | |
|     # the missing ones are the agents which are to be deleted from the inbox
 | |
|     # the new ones are the agents which are to be added to the inbox
 | |
|     ActiveRecord::Base.transaction do
 | |
|       @inbox.add_members(agents_to_be_added_ids)
 | |
|       @inbox.remove_members(agents_to_be_removed_ids)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def agents_to_be_added_ids
 | |
|     params[:user_ids] - @current_agents_ids
 | |
|   end
 | |
| 
 | |
|   def agents_to_be_removed_ids
 | |
|     @current_agents_ids - params[:user_ids]
 | |
|   end
 | |
| 
 | |
|   def current_agents_ids
 | |
|     @current_agents_ids = @inbox.members.pluck(:id)
 | |
|   end
 | |
| 
 | |
|   def fetch_inbox
 | |
|     @inbox = Current.account.inboxes.find(params[:inbox_id])
 | |
|   end
 | |
| end
 |