mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-02 12:08:01 +00:00
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
56 lines
1.3 KiB
Ruby
56 lines
1.3 KiB
Ruby
class Api::V1::Accounts::TeamMembersController < Api::V1::Accounts::BaseController
|
|
before_action :fetch_team
|
|
before_action :check_authorization
|
|
before_action :validate_member_id_params, only: [:create, :update, :destroy]
|
|
|
|
def index
|
|
@team_members = @team.team_members.map(&:user)
|
|
end
|
|
|
|
def create
|
|
ActiveRecord::Base.transaction do
|
|
@team_members = @team.add_members(members_to_be_added_ids)
|
|
end
|
|
end
|
|
|
|
def update
|
|
ActiveRecord::Base.transaction do
|
|
@team.add_members(members_to_be_added_ids)
|
|
@team.remove_members(members_to_be_removed_ids)
|
|
end
|
|
@team_members = @team.members
|
|
render action: 'create'
|
|
end
|
|
|
|
def destroy
|
|
ActiveRecord::Base.transaction do
|
|
@team.remove_members(params[:user_ids])
|
|
end
|
|
head :ok
|
|
end
|
|
|
|
private
|
|
|
|
def members_to_be_added_ids
|
|
params[:user_ids] - current_members_ids
|
|
end
|
|
|
|
def members_to_be_removed_ids
|
|
current_members_ids - params[:user_ids]
|
|
end
|
|
|
|
def current_members_ids
|
|
@current_members_ids ||= @team.members.pluck(:id)
|
|
end
|
|
|
|
def fetch_team
|
|
@team = Current.account.teams.find(params[:team_id])
|
|
end
|
|
|
|
def validate_member_id_params
|
|
invalid_ids = params[:user_ids].map(&:to_i) - @team.account.user_ids
|
|
|
|
render json: { error: 'Invalid User IDs' }, status: :unauthorized and return if invalid_ids.present?
|
|
end
|
|
end
|