app/controllers/admin/sessions_controller.rb



class Admin::SessionsController < Devise::SessionsController
  def create
    user = find_user

    if authenticated?(user)
      handle_successful_authentication(user)
    else
      handle_failed_authentication
    end
  end

  private

  def find_user
    User.find_by(email: params[:user][:email])
  end

  def authenticated?(user)
    user&.valid_password?(params[:user][:password])
  end

  def handle_successful_authentication(user)
    if user.otp_required_for_login
      start_two_factor_session(user)
      redirect_to admin_two_factor_path
    else
      sign_in(:user, user)
      redirect_to after_sign_in_path_for(user)
    end
  end

  def handle_failed_authentication
    self.resource = resource_class.new(sign_in_params)
    clean_up_passwords(resource)
    flash.now[:alert] = t('invalid_email_or_password')
    render :new
  end

  def start_two_factor_session(user)
    session[:pre_2fa_user_id] = user.id
    session[:pre_2fa_started_at] = Time.current.to_i
  end
end