Initial commit
This commit is contained in:
93
app/models/service_account.rb
Normal file
93
app/models/service_account.rb
Normal file
@@ -0,0 +1,93 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
# ServiceAccount model
|
||||
class ServiceAccount < ApplicationRecord
|
||||
UID_PREFIX = 'SI'
|
||||
|
||||
belongs_to :user, foreign_key: "owner_id", optional: true
|
||||
has_many :api_keys, as: :key_holder_account, dependent: :destroy, class_name: 'APIKey'
|
||||
|
||||
validate :role_exists
|
||||
validate :email_n_uid_uniqueness
|
||||
validates :email, email: true, presence: true, uniqueness: true
|
||||
validates :uid, presence: true, uniqueness: true
|
||||
|
||||
scope :active, -> { where(state: 'active') }
|
||||
|
||||
after_update :disable_api_keys
|
||||
before_create :assign_state, if: -> { user.present? }
|
||||
# System will assign user state only if there is no changes of state during update
|
||||
before_update :assign_state, if: -> { user.present? && !state_changed? }
|
||||
before_validation :assign_level, if: -> { user.present? }
|
||||
before_validation :assign_uid
|
||||
before_validation :assign_email
|
||||
|
||||
def active?
|
||||
self.state == 'active'
|
||||
end
|
||||
|
||||
def disable_api_keys
|
||||
if state_previously_changed? && state == 'disabled'
|
||||
api_keys.active.each do |key|
|
||||
key.update(state: 'inactive')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def as_payload
|
||||
as_json(only: %i[uid email role level state])
|
||||
end
|
||||
|
||||
def role_exists
|
||||
return if Permission.pluck(:role).include?(role)
|
||||
|
||||
errors.add(:role, 'doesnt_exist')
|
||||
end
|
||||
|
||||
def email_n_uid_uniqueness
|
||||
errors.add('email_or_uid', 'not_uniq') if User.find_by(email: email) || User.find_by(uid: uid)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def assign_email
|
||||
return unless email.blank?
|
||||
|
||||
name, domain = user.email.split('@')
|
||||
self.email = "#{name}+#{self.uid}@#{domain}"
|
||||
end
|
||||
|
||||
def assign_uid
|
||||
return unless uid.blank?
|
||||
|
||||
self.uid = UIDGenerator.generate(UID_PREFIX)
|
||||
end
|
||||
|
||||
def assign_state
|
||||
self.state = user.state
|
||||
end
|
||||
|
||||
def update_state
|
||||
!state_changed?
|
||||
end
|
||||
|
||||
def assign_level
|
||||
self.level = user.level
|
||||
end
|
||||
end
|
||||
|
||||
# == Schema Information
|
||||
# Schema version: 20210218135634
|
||||
#
|
||||
# Table name: service_accounts
|
||||
#
|
||||
# id :bigint not null, primary key
|
||||
# uid :string(255) not null
|
||||
# owner_id :bigint unsigned
|
||||
# email :string(255) not null
|
||||
# role :string(255) default("service_account"), not null
|
||||
# level :integer default(0), not null
|
||||
# state :string(255) default("pending"), not null
|
||||
# created_at :datetime not null
|
||||
# updated_at :datetime not null
|
||||
#
|
||||
Reference in New Issue
Block a user