mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-03 20:48:07 +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
		
			
				
	
	
		
			71 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# == Schema Information
 | 
						|
#
 | 
						|
# Table name: teams
 | 
						|
#
 | 
						|
#  id                :bigint           not null, primary key
 | 
						|
#  allow_auto_assign :boolean          default(TRUE)
 | 
						|
#  description       :text
 | 
						|
#  name              :string           not null
 | 
						|
#  created_at        :datetime         not null
 | 
						|
#  updated_at        :datetime         not null
 | 
						|
#  account_id        :bigint           not null
 | 
						|
#
 | 
						|
# Indexes
 | 
						|
#
 | 
						|
#  index_teams_on_account_id           (account_id)
 | 
						|
#  index_teams_on_name_and_account_id  (name,account_id) UNIQUE
 | 
						|
#
 | 
						|
class Team < ApplicationRecord
 | 
						|
  include AccountCacheRevalidator
 | 
						|
 | 
						|
  belongs_to :account
 | 
						|
  has_many :team_members, dependent: :destroy_async
 | 
						|
  has_many :members, through: :team_members, source: :user
 | 
						|
  has_many :conversations, dependent: :nullify
 | 
						|
 | 
						|
  validates :name,
 | 
						|
            presence: { message: I18n.t('errors.validations.presence') },
 | 
						|
            uniqueness: { scope: :account_id }
 | 
						|
 | 
						|
  before_validation do
 | 
						|
    self.name = name.downcase if attribute_present?('name')
 | 
						|
  end
 | 
						|
 | 
						|
  # Adds multiple members to the team
 | 
						|
  # @param user_ids [Array<Integer>] Array of user IDs to add as members
 | 
						|
  # @return [Array<User>] Array of newly added members
 | 
						|
  def add_members(user_ids)
 | 
						|
    team_members_to_create = user_ids.map { |user_id| { user_id: user_id } }
 | 
						|
    created_members = team_members.create(team_members_to_create)
 | 
						|
    added_users = created_members.filter_map(&:user)
 | 
						|
 | 
						|
    update_account_cache
 | 
						|
    added_users
 | 
						|
  end
 | 
						|
 | 
						|
  # Removes multiple members from the team
 | 
						|
  # @param user_ids [Array<Integer>] Array of user IDs to remove
 | 
						|
  # @return [void]
 | 
						|
  def remove_members(user_ids)
 | 
						|
    team_members.where(user_id: user_ids).destroy_all
 | 
						|
    update_account_cache
 | 
						|
  end
 | 
						|
 | 
						|
  def messages
 | 
						|
    account.messages.where(conversation_id: conversations.pluck(:id))
 | 
						|
  end
 | 
						|
 | 
						|
  def reporting_events
 | 
						|
    account.reporting_events.where(conversation_id: conversations.pluck(:id))
 | 
						|
  end
 | 
						|
 | 
						|
  def push_event_data
 | 
						|
    {
 | 
						|
      id: id,
 | 
						|
      name: name
 | 
						|
    }
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
Team.include_mod_with('Audit::Team')
 |