korolvs/thatsaboy

View on GitHub
api/app/controllers/user/user_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
# User controller
class User::UserController < ApplicationController
  before_action :set_token_type_for_confirmation, only: [:confirm]
  before_action :set_token_type_for_recovery, only: [:recovery]
  before_action :authorize!, only: [:logout, :confirm, :recovery, :pin_set, :pin_check]
  before_action :get_email_and_password, only: [:register, :login]
  after_action :send_confirmation_email, only: :register
  after_action :send_recovery_email, only: :request_recovery

  # Method for registration
  def register
    @user = User::User.new(@email, @password)
    @token = @user.create_token(User::Token::TYPE_CONFIRMATION)
    @user.save!
    render json: @user
  end

  # Method for login
  def login
    user = User::User.find_by_email(@email)
    raise Core::Errors::UnauthorizedError, 'Wrong email or password' unless user && user.password_is_right?(@password)
    token = user.create_token(User::Token::TYPE_LOGIN)
    token.save!
    render json: token
  end

  # Method for logout
  def logout
    @token.expire
    @token.save!
  end

  # Method for confirmation
  def confirm
    @user.confirm
    @user.save!
    @token.expire
    @token.save!
  end

  # Method for request password recovery
  def request_recovery
    @user = User::User.find_by_email(params[:email])
    return if @user.nil?
    @token = @user.create_token(User::Token::TYPE_RECOVERY)
    @token.save!
  end

  # Method for password recovery
  def recovery
    password = params[:password] || ''
    @user.update!(password: password)
    @token.expire
    @token.save!
  end

  # Method for setting the pin
  def pin_set
    @user.update!(pin: params[:pin])
  end

  # Method for checking the pin
  def pin_check
    render json: { equal: @user.pin == params[:pin] }
  end

  # Method for waking up an application(for Heroku)
  def wakeup
    render plain: 'Good morning!'
  end

  private

  # Params for a user
  def get_email_and_password
    @email = params[:email] || ''
    @password = params[:password] || ''
  end

  # Sends a confirmation email
  def send_confirmation_email
    Mailer.confirmation_email(@user.email, @token.code).deliver_later
  rescue => e
    Rails.logger.error 'Mail sending error: ' + e.message
  end

  # Sends a recovery email
  def send_recovery_email
    Mailer.recovery_email(@user.email, @token.code).deliver_later
  rescue => e
    Rails.logger.error 'Mail sending error: ' + e.message
  end

  # Sets right token type
  def set_token_type_for_confirmation
    @token_type = User::Token::TYPE_CONFIRMATION
  end

  # Sets right token type
  def set_token_type_for_recovery
    @token_type = User::Token::TYPE_RECOVERY
    @not_show_authorization_error = true
  end
end