Files
danbooru/app/models/email_address.rb

81 lines
2.2 KiB
Ruby

# frozen_string_literal: true
class EmailAddress < ApplicationRecord
belongs_to :user, inverse_of: :email_address
attribute :address
attribute :normalized_address
validates :address, presence: true, format: { message: "is invalid", with: Danbooru::EmailAddress::EMAIL_REGEX }
validates :normalized_address, presence: true, uniqueness: true
validates :user_id, uniqueness: true
validate :validate_deliverable, on: :deliverable
def self.visible(user)
if user.is_moderator?
where(user: User.where("level < ?", user.level).or(User.where(id: user.id)))
else
none
end
end
def address=(value)
value = Danbooru::EmailAddress.correct(value)&.to_s || value
self.normalized_address = Danbooru::EmailAddress.parse(value)&.canonicalized_address&.to_s || value
super
end
def is_restricted?
!Danbooru::EmailAddress.new(normalized_address).is_nondisposable?
end
def is_normalized?
address == normalized_address
end
def self.restricted(restricted = true)
domains = Danbooru::EmailAddress::NONDISPOSABLE_DOMAINS
domain_regex = domains.map { |domain| Regexp.escape(domain) }.join("|")
if restricted.to_s.truthy?
where_not_regex(:normalized_address, "@(#{domain_regex})$")
elsif restricted.to_s.falsy?
where_regex(:normalized_address, "@(#{domain_regex})$")
else
all
end
end
def self.search(params, current_user)
q = search_attributes(params, [:id, :created_at, :updated_at, :user, :address, :normalized_address, :is_verified, :is_deliverable], current_user: current_user)
q = q.restricted(params[:is_restricted])
q.apply_default_order(params)
end
def validate_deliverable
if Danbooru::EmailAddress.new(address).undeliverable?(allow_smtp: Rails.env.production?)
errors.add(:address, "is invalid or does not exist")
end
end
def verify!
transaction do
update!(is_verified: true)
if user.is_restricted? && !is_restricted?
user.update!(level: User::Levels::MEMBER, is_verified: is_verified?)
end
end
end
def verification_key
signed_id(purpose: "verify")
end
def self.available_includes
[:user]
end
end