This API change sets the foundation for an upcoming frontend update, transitioning from a role-based model to a permission-based model. This new approach will determine eligibility for various actions and UI elements based on specific permissions rather than roles, enhancing flexibility and security in user access management.
81 lines
2.1 KiB
Ruby
81 lines
2.1 KiB
Ruby
# == Schema Information
|
|
#
|
|
# Table name: account_users
|
|
#
|
|
# id :bigint not null, primary key
|
|
# active_at :datetime
|
|
# auto_offline :boolean default(TRUE), not null
|
|
# availability :integer default("online"), not null
|
|
# role :integer default("agent")
|
|
# created_at :datetime not null
|
|
# updated_at :datetime not null
|
|
# account_id :bigint
|
|
# inviter_id :bigint
|
|
# user_id :bigint
|
|
#
|
|
# Indexes
|
|
#
|
|
# index_account_users_on_account_id (account_id)
|
|
# index_account_users_on_user_id (user_id)
|
|
# uniq_user_id_per_account_id (account_id,user_id) UNIQUE
|
|
#
|
|
|
|
class AccountUser < ApplicationRecord
|
|
include AvailabilityStatusable
|
|
|
|
belongs_to :account
|
|
belongs_to :user
|
|
belongs_to :inviter, class_name: 'User', optional: true
|
|
|
|
enum role: { agent: 0, administrator: 1 }
|
|
enum availability: { online: 0, offline: 1, busy: 2 }
|
|
|
|
accepts_nested_attributes_for :account
|
|
|
|
after_create_commit :notify_creation, :create_notification_setting
|
|
after_destroy :notify_deletion, :remove_user_from_account
|
|
after_save :update_presence_in_redis, if: :saved_change_to_availability?
|
|
|
|
validates :user_id, uniqueness: { scope: :account_id }
|
|
|
|
def create_notification_setting
|
|
setting = user.notification_settings.new(account_id: account.id)
|
|
setting.selected_email_flags = [:email_conversation_assignment]
|
|
setting.selected_push_flags = [:push_conversation_assignment]
|
|
setting.save!
|
|
end
|
|
|
|
def remove_user_from_account
|
|
::Agents::DestroyJob.perform_later(account, user)
|
|
end
|
|
|
|
def permissions
|
|
administrator? ? ['administrator'] : ['agent']
|
|
end
|
|
|
|
def push_event_data
|
|
{
|
|
id: id,
|
|
availability: availability,
|
|
role: role,
|
|
user_id: user_id
|
|
}
|
|
end
|
|
|
|
private
|
|
|
|
def notify_creation
|
|
Rails.configuration.dispatcher.dispatch(AGENT_ADDED, Time.zone.now, account: account)
|
|
end
|
|
|
|
def notify_deletion
|
|
Rails.configuration.dispatcher.dispatch(AGENT_REMOVED, Time.zone.now, account: account)
|
|
end
|
|
|
|
def update_presence_in_redis
|
|
OnlineStatusTracker.set_status(account.id, user.id, availability)
|
|
end
|
|
end
|
|
|
|
AccountUser.include_mod_with('Audit::AccountUser')
|