mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-01 19:48:08 +00:00
Co-authored-by: Sojan <sojan@pepalo.com> Co-authored-by: Shivam Mishra <scm.mymail@gmail.com> Co-authored-by: Pranav <pranav@chatwoot.com>
55 lines
2.0 KiB
Ruby
55 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
|