60 lines
2.2 KiB
Ruby
60 lines
2.2 KiB
Ruby
class InviteRequest < ApplicationRecord
|
|
validates :email, presence: true, email_format: true
|
|
validates :email, uniqueness: { message: "is already part of our queue." }
|
|
before_validation :set_simplified_email, on: :create
|
|
validate :check_admin_banned_list, on: :create
|
|
validate :compare_with_users, on: :create
|
|
validate :simplified_email_uniqueness, on: :create
|
|
|
|
# Borrow the blacklist cleaner but just strip out all the periods for all domains
|
|
def set_simplified_email
|
|
return if email.blank?
|
|
|
|
simplified = AdminBlacklistedEmail.canonical_email(email).split('@')
|
|
self.simplified_email = simplified.first.delete(".").gsub(/\+.+$/, "") + "@#{simplified.last}"
|
|
end
|
|
|
|
# Doing this with a method so the error message makes more sense
|
|
def simplified_email_uniqueness
|
|
# Exit if raw email uniqueness error already exists
|
|
return if errors.of_kind?(:email, :taken)
|
|
|
|
errors.add(:email, "is already part of our queue.") if InviteRequest.exists?(simplified_email: simplified_email)
|
|
end
|
|
|
|
def proposed_fill_time
|
|
admin_settings = AdminSetting.current
|
|
number_of_rounds = (self.position.to_f/admin_settings.invite_from_queue_number.to_f).ceil - 1
|
|
proposed_time = admin_settings.invite_from_queue_at + (admin_settings.invite_from_queue_frequency * number_of_rounds).hours
|
|
Time.current > proposed_time ? Time.current : proposed_time
|
|
end
|
|
|
|
def position
|
|
InviteRequest.where("id <= ?", id).count
|
|
end
|
|
|
|
# Ensure that email is not banned
|
|
def check_admin_banned_list
|
|
return unless email.present? && AdminBlacklistedEmail.is_blacklisted?(email)
|
|
|
|
errors.add(:email, :blocked_email)
|
|
throw :abort
|
|
end
|
|
|
|
# Ensure that invite request is for a new user
|
|
def compare_with_users
|
|
return unless User.exists?(email: self.email)
|
|
|
|
errors.add(:email, :email_in_use)
|
|
throw :abort
|
|
end
|
|
|
|
# Turn a request into an invite and then remove it from the queue
|
|
def invite_and_remove(creator=nil)
|
|
invitation = creator ? creator.invitations.build(invitee_email: self.email, from_queue: true) :
|
|
Invitation.new(invitee_email: self.email, from_queue: true)
|
|
if invitation.save
|
|
self.destroy
|
|
end
|
|
end
|
|
end
|