66 lines
1.5 KiB
Ruby
66 lines
1.5 KiB
Ruby
require 'zoom_gateway'
|
|
require 'securerandom'
|
|
class ZoomUser < ApplicationRecord
|
|
has_many :zoom_meetings, dependent: :nullify
|
|
|
|
enum tier: [:basic, :pro]
|
|
|
|
after_create :create_api_user, if: -> { api_id.nil? }
|
|
before_destroy :abort_destroy
|
|
|
|
scope :current_account, -> { where(account_number: ZoomGateway.ACCOUNT_NUMBER) }
|
|
scope :free, -> { where.not(id: ZoomMeeting.active.pluck(:zoom_user_id)) }
|
|
|
|
def create_api_user
|
|
retries ||= 0
|
|
self.api_id = gateway.create_host(self.class.generate_api_email)
|
|
self.account_number = ZoomGateway.ACCOUNT_NUMBER
|
|
save
|
|
rescue ZoomGateway::UserAlreadyExists => e
|
|
retries += 1
|
|
if retries < 3
|
|
retry # new api email will be generated automatically
|
|
else
|
|
raise e
|
|
end
|
|
end
|
|
|
|
def delete_api_user
|
|
gateway.delete_host(self.api_id)
|
|
self.api_id = nil
|
|
save
|
|
end
|
|
|
|
def current_account?
|
|
account_number == ZoomGateway.ACCOUNT_NUMBER
|
|
end
|
|
|
|
# Static methods
|
|
class << self
|
|
def generate_api_email
|
|
"host#{SecureRandom.random_number(10000)}@directme"
|
|
end
|
|
|
|
def for_new_meeting
|
|
user = public_send(ZoomGateway.USER_TYPE_NAME).current_account.free.first
|
|
if user.nil?
|
|
user = public_send(ZoomGateway.USER_TYPE_NAME).current_account.create
|
|
end
|
|
user
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def abort_destroy
|
|
if api_id.present?
|
|
errors.add(:base, "You can't destroy ZoomUser before explicitly deleting it through API.")
|
|
throw(:abort)
|
|
end
|
|
end
|
|
|
|
def gateway
|
|
@gateway ||= ZoomGateway.new
|
|
end
|
|
end
|