class CryptIdent::SignUp

Reworked sign-up logic for `CryptIdent`, per Issue #9

This class *is not* part of the published API. @private

Public Instance Methods

call(attribs, current_user:) click to toggle source
# File lib/crypt_ident/sign_up.rb, line 101
def call(attribs, current_user:)
  return failure_for(:current_user_exists) if current_user?(current_user)

  create_result(all_attribs(attribs))
end

Private Instance Methods

all_attribs(attribs) click to toggle source
# File lib/crypt_ident/sign_up.rb, line 109
def all_attribs(attribs)
  new_attribs.merge(attribs)
end
create_result(attribs_in) click to toggle source

XXX: This has a Flog score of 9.8. Truly simplifying PRs welcome.

# File lib/crypt_ident/sign_up.rb, line 114
def create_result(attribs_in)
  user = CryptIdent.config.repository.create(attribs_in)
  success_for(user)
rescue Hanami::Model::UniqueConstraintViolationError
  failure_for(:user_already_created)
rescue Hanami::Model::Error
  failure_for(:user_creation_failed)
end
current_user?(user) click to toggle source
# File lib/crypt_ident/sign_up.rb, line 123
def current_user?(user)
  guest_user = CryptIdent.config.guest_user
  user ||= guest_user
  !guest_user.class.new(user).guest?
end
failure_for(code) click to toggle source
# File lib/crypt_ident/sign_up.rb, line 129
def failure_for(code)
  Failure(code: code)
end
hashed_password(password_in) click to toggle source
# File lib/crypt_ident/sign_up.rb, line 133
def hashed_password(password_in)
  password = password_in.to_s.strip
  password = SecureRandom.alphanumeric(64) if password.empty?
  ::BCrypt::Password.create(password)
end
new_attribs() click to toggle source
# File lib/crypt_ident/sign_up.rb, line 139
def new_attribs
  prea = Time.now + CryptIdent.config.reset_expiry
  {
    password_hash: hashed_password(nil),
    password_reset_expires_at: prea,
    token: new_token
  }
end
new_token() click to toggle source
# File lib/crypt_ident/sign_up.rb, line 148
def new_token
  token_length = CryptIdent.config.token_bytes
  clear_text_token = SecureRandom.alphanumeric(token_length)
  Base64.strict_encode64(clear_text_token)
end
success_for(user) click to toggle source
# File lib/crypt_ident/sign_up.rb, line 154
def success_for(user)
  Success(user: user)
end