This way we make it clear we expect records to be valid when we save them, just like we do with ActiveRecord models.
68 lines
1.9 KiB
Ruby
68 lines
1.9 KiB
Ruby
class Verification::Management::Email
|
|
include ActiveModel::Model
|
|
|
|
attr_accessor :document_type
|
|
attr_accessor :document_number
|
|
attr_accessor :email
|
|
|
|
validates :document_type, :document_number, :email, presence: true
|
|
validates :email, format: { with: Devise.email_regexp }, allow_blank: true
|
|
validate :validate_user
|
|
validate :validate_document_number
|
|
|
|
delegate :username, to: :user, allow_nil: true
|
|
|
|
def user
|
|
@user ||= User.where(email: email).first
|
|
end
|
|
|
|
def user?
|
|
user.present?
|
|
end
|
|
|
|
def save
|
|
return false unless valid?
|
|
|
|
plain_token, encrypted_token = Devise.token_generator.generate(User, :email_verification_token)
|
|
|
|
user.update(document_type: document_type,
|
|
document_number: document_number,
|
|
residence_verified_at: Time.current,
|
|
level_two_verified_at: Time.current,
|
|
email_verification_token: plain_token)
|
|
|
|
Mailer.email_verification(user, email, encrypted_token, document_type, document_number).deliver_later
|
|
true
|
|
end
|
|
|
|
def save!
|
|
validate! && save
|
|
end
|
|
|
|
private
|
|
|
|
def validate_user
|
|
return if errors.count > 0
|
|
if !user?
|
|
errors.add(:email, I18n.t("errors.messages.user_not_found"))
|
|
elsif user.level_three_verified?
|
|
errors.add(:email, I18n.t("management.email_verifications.already_verified"))
|
|
end
|
|
end
|
|
|
|
def validate_document_number
|
|
return if errors.count > 0
|
|
if document_number_mismatch?
|
|
errors.add(:email,
|
|
I18n.t("management.email_verifications.document_mismatch",
|
|
document_type: ApplicationController.helpers.humanize_document_type(user.document_type),
|
|
document_number: user.document_number))
|
|
end
|
|
end
|
|
|
|
def document_number_mismatch?
|
|
user? && user.document_number.present? &&
|
|
(user.document_number != document_number || user.document_type != document_type)
|
|
end
|
|
end
|