mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-10-31 11:08:04 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			57 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # The AgentBuilder class is responsible for creating a new agent.
 | |
| # It initializes with necessary attributes and provides a perform method
 | |
| # to create a user and account user in a transaction.
 | |
| class AgentBuilder
 | |
|   # Initializes an AgentBuilder with necessary attributes.
 | |
|   # @param email [String] the email of the user.
 | |
|   # @param name [String] the name of the user.
 | |
|   # @param role [String] the role of the user, defaults to 'agent' if not provided.
 | |
|   # @param inviter [User] the user who is inviting the agent (Current.user in most cases).
 | |
|   # @param availability [String] the availability status of the user, defaults to 'offline' if not provided.
 | |
|   # @param auto_offline [Boolean] the auto offline status of the user.
 | |
|   pattr_initialize [:email, { name: '' }, :inviter, :account, { role: :agent }, { availability: :offline }, { auto_offline: false }]
 | |
| 
 | |
|   # Creates a user and account user in a transaction.
 | |
|   # @return [User] the created user.
 | |
|   def perform
 | |
|     ActiveRecord::Base.transaction do
 | |
|       @user = find_or_create_user
 | |
|       create_account_user
 | |
|     end
 | |
|     @user
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   # Finds a user by email or creates a new one with a temporary password.
 | |
|   # @return [User] the found or created user.
 | |
|   def find_or_create_user
 | |
|     user = User.from_email(email)
 | |
|     return user if user
 | |
| 
 | |
|     temp_password = "1!aA#{SecureRandom.alphanumeric(12)}"
 | |
|     User.create!(email: email, name: name, password: temp_password, password_confirmation: temp_password)
 | |
|   end
 | |
| 
 | |
|   # Checks if the user needs confirmation.
 | |
|   # @return [Boolean] true if the user is persisted and not confirmed, false otherwise.
 | |
|   def user_needs_confirmation?
 | |
|     @user.persisted? && !@user.confirmed?
 | |
|   end
 | |
| 
 | |
|   # Creates an account user linking the user to the current account.
 | |
|   def create_account_user
 | |
|     AccountUser.create!({
 | |
|       account_id: account.id,
 | |
|       user_id: @user.id,
 | |
|       inviter_id: inviter.id
 | |
|     }.merge({
 | |
|       role: role,
 | |
|       availability: availability,
 | |
|       auto_offline: auto_offline
 | |
|     }.compact))
 | |
|   end
 | |
| end
 | |
| 
 | |
| AgentBuilder.prepend_mod_with('AgentBuilder')
 | 
