class Api::V1::Accounts::AgentsController < Api::V1::Accounts::BaseController before_action :fetch_agent, except: [:create, :index, :bulk_create] before_action :check_authorization before_action :validate_limit, only: [:create] before_action :validate_limit_for_bulk_create, only: [:bulk_create] def index @agents = agents end def create builder = AgentBuilder.new( email: new_agent_params['email'], name: new_agent_params['name'], role: new_agent_params['role'], availability: new_agent_params['availability'], auto_offline: new_agent_params['auto_offline'], inviter: current_user, account: Current.account ) builder.perform end def update @agent.update!(agent_params.slice(:name).compact) @agent.current_account_user.update!(agent_params.slice(:role, :availability, :auto_offline).compact) end def destroy @agent.current_account_user.destroy! delete_user_record(@agent) head :ok end def bulk_create emails = params[:emails] emails.each do |email| builder = AgentBuilder.new( email: email, name: email.split('@').first, inviter: current_user, account: Current.account ) begin builder.perform rescue ActiveRecord::RecordInvalid => e Rails.logger.info "[Agent#bulk_create] ignoring email #{email}, errors: #{e.record.errors}" end end head :ok end private def check_authorization super(User) end def fetch_agent @agent = agents.find(params[:id]) end def agent_params params.require(:agent).permit(:name, :email, :name, :role, :availability, :auto_offline) end def new_agent_params params.require(:agent).permit(:email, :name, :role, :availability, :auto_offline) end def agents @agents ||= Current.account.users.order_by_full_name.includes(:account_users, { avatar_attachment: [:blob] }) end def validate_limit_for_bulk_create limit_available = params[:emails].count <= available_agent_count render_payment_required('Account limit exceeded. Please purchase more licenses') unless limit_available end def validate_limit render_payment_required('Account limit exceeded. Please purchase more licenses') unless can_add_agent? end def available_agent_count Current.account.usage_limits[:agents] - agents.count end def can_add_agent? available_agent_count.positive? end def delete_user_record(agent) DeleteObjectJob.perform_later(agent) if agent.reload.account_users.blank? end end