ilpoldo/user_plane

View on GitHub
app/models/user/reset_password.rb

Summary

Maintainability
A
0 mins
Test Coverage
module User
  class ResetPassword < UserPlane::Command
    include ActiveModel::Validations::Callbacks

    attribute :password
    attribute :password_confirmation

    attr_accessor :code
    attr_accessor :verification
    attr_accessor :identity

    validates :password, :password_confirmation, presence: true
    validate {|r| r.errors.add(:code, 'is not valid') unless r.verification}
    validates :verification, presence: true,
                             receiver: {map_attributes: {created_at: :code,
                                                         base:       :code,
                                                         spent_at:   :code}}
    validates :identity, receiver: {map_attributes: {password: :password,
                                                     password_confirmation: :password_confirmation}}

    def to_param
      self.code
    end

    def persisted?
      verification && verification.persisted?
    end

    def code= token
      @code = token

      password_reset_query = User::Identities::EmailVerification.password_reset.where(token: code)
      if @identity = User::Identities::Email.joins(:verifications).merge(password_reset_query).first
        @verification = identity.verifications.detect {|v| v.token == code}
      else
        raise ActiveRecord::RecordNotFound
      end
    end

    def verification= verification
      return unless verification
      @code = verification.token
      @verification = verification
      @identity = verification.email
    end

    before_validation do
      if verification
        identity.attributes = {password: password,
                               password_confirmation: password_confirmation}
        verification.spend
      end
    end

    action do
      identity.save
    end
  end
end