Sha256: 04f43f2aaee4e4fa3a88d58a982b488c87e5a9fc22fd1e17b09837bc4e329d99

Contents?: true

Size: 1.88 KB

Versions: 1

Compression:

Stored size: 1.88 KB

Contents

# frozen_string_literal: true

require "uri"
require "phony"

module PUNK
  class CreateSessionAction < Action
    args :claim, :remote_addr, :user_agent

    def validate
      validates_not_null :claim
      validates_not_empty :claim
      validates_not_null :claim_type, message: "is not an email address or phone number"
      validates_email :claim if claim_type == :email
      validates_phone :claim if claim_type == :phone
      validates_not_null :remote_addr
      validates_not_empty :remote_addr
      validates_not_null :user_agent
      validates_not_empty :user_agent
    end

    def process
      PUNK.db.transaction do
        identity =
          Identity.find_or_create(claim: _normalize_claim) do |i|
            i.claim_type = claim_type
          end
        session = Session.create(identity: identity, remote_addr: remote_addr, user_agent: user_agent)
        ChallengeClaimService.run(session: session)
        IdentifySessionWorker.perform_async(session_id: session.id)
        message =
          case identity.claim_type
          when :email
            "We have sent a verification code to your email address. Please enter it to verify your identity."
          when :phone
            "We have sent a verification code to your phone number by SMS. Please enter it to verify your identity."
          end
        present PendingSessionView, session: session, message: message, status: 201
      end
    end

    def claim_type
      @claim_type ||= _guess_claim_type
    end

    private

    def _guess_claim_type
      return :email if URI::MailTo::EMAIL_REGEXP.match(claim)
      return :phone if Phony.plausible?(claim)
    end

    def _normalize_claim
      case claim_type
      when :email
        claim.downcase.strip
      when :phone
        phone = claim.strip
        phone = "+1#{phone}" unless /^[+]/.match?(phone)
        "+#{Phony.normalize(phone)}"
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
punk-0.4.1 lib/punk/actions/sessions/create.rb