Chatwoot/app/builders/account_builder.rb

80 lines
1.7 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
class AccountBuilder
include CustomExceptions::Account
pattr_initialize [:account_name!, :email!, :confirmed!, :user]
def perform
if @user.nil?
validate_email
validate_user
end
2019-10-20 08:47:26 +00:00
ActiveRecord::Base.transaction do
@account = create_account
@user = create_and_link_user
end
[@user, @account]
2019-10-20 08:47:26 +00:00
rescue StandardError => e
@account&.destroy
puts e.inspect
raise e
end
private
def validate_email
address = ValidEmail2::Address.new(@email)
2019-10-20 08:47:26 +00:00
if address.valid? # && !address.disposable?
true
else
2019-10-20 08:47:26 +00:00
raise InvalidEmail.new(valid: address.valid?) # , disposable: address.disposable?})
end
end
def validate_user
if User.exists?(email: @email)
2019-10-20 08:47:26 +00:00
raise UserExists.new(email: @email)
else
true
end
end
def create_account
@account = Account.create!(name: @account_name, locale: I18n.locale)
Current.account = @account
end
def create_and_link_user
if @user.present? || create_user
link_user_to_account(@user, @account)
@user
else
2019-10-20 08:47:26 +00:00
raise UserErrors.new(errors: @user.errors)
end
end
def link_user_to_account(user, account)
AccountUser.create!(
account_id: account.id,
user_id: user.id,
role: AccountUser.roles['administrator']
)
end
def email_to_name(email)
name = email[/[^@]+/]
2019-10-20 08:47:26 +00:00
name.split('.').map(&:capitalize).join(' ')
end
def create_user
password = SecureRandom.alphanumeric(12)
@user = User.new(email: @email,
password: password,
password_confirmation: password,
name: email_to_name(@email))
@user.confirm if @confirmed
@user.save!
end
end