71 lines
2.4 KiB
Ruby
71 lines
2.4 KiB
Ruby
# app/controllers/users/sessions_controller.rb
|
|
class Users::SessionsController < Devise::SessionsController
|
|
before_action :configure_sign_in_params, only: [:create]
|
|
|
|
# GET /users/sign_in
|
|
def new
|
|
@pin_login = params[:pin].present?
|
|
|
|
# "Para continuar, faça login." NÃO é erro: é o que o Devise sempre grava
|
|
# quando alguém abre o sistema deslogado (raiz -> authenticate_user! -> aqui).
|
|
# Como `flash[:alert]` ele saía em vermelho DUAS vezes — o toast do layout e
|
|
# a caixa desta tela — e a primeira entrada do dia parecia falha do sistema
|
|
# (foi relatado como bug: "a primeira vez que entra dá a tela de erro").
|
|
#
|
|
# A mensagem é descartada: a tela já é o formulário de login, ela não
|
|
# acrescenta nada. NÃO troque isso por apagar todo `flash[:alert]` no `new`:
|
|
# senha errada, conta inativa e `timeout` ("Sua sessão expirou") chegam por
|
|
# aqui pelo mesmo caminho, e essas a pessoa PRECISA ver em vermelho.
|
|
flash.delete(:alert) if flash[:alert] == I18n.t('devise.failure.unauthenticated', default: nil)
|
|
|
|
super
|
|
end
|
|
|
|
# POST /users/sign_in
|
|
def create
|
|
# PIN login para motoristas
|
|
if params[:pin_login].present?
|
|
handle_pin_login
|
|
else
|
|
super
|
|
end
|
|
end
|
|
|
|
protected
|
|
|
|
# Para onde a pessoa vai depois de entrar. NÃO é mais "motorista → painel,
|
|
# resto → dashboard": com perfis de acesso, alguém pode não ter o dashboard e
|
|
# cairia direto numa tela negada. `home_rota` devolve a primeira tela permitida.
|
|
def after_sign_in_path_for(resource)
|
|
session[:mostrar_splash] = true # dispara a animação de abertura uma vez
|
|
rota = resource.home_rota
|
|
rota ? public_send(rota) : sem_acesso_path
|
|
end
|
|
|
|
def after_sign_out_path_for(resource_or_scope)
|
|
new_user_session_path
|
|
end
|
|
|
|
def configure_sign_in_params
|
|
devise_parameter_sanitizer.permit(:sign_in, keys: [:email, :password, :pin])
|
|
end
|
|
|
|
private
|
|
|
|
def handle_pin_login
|
|
pin = params[:pin].to_s.strip
|
|
user = User.find_by(pin_code: pin, role: 'motorista')
|
|
|
|
if user&.ativo?
|
|
sign_in(user)
|
|
session[:mostrar_splash] = true
|
|
AuditoriaLog.registrar(user: user, acao: 'login_pin', entidade: 'User', dados_novos: { detalhes: "" }, request: request)
|
|
redirect_to motorista_dashboard_path, notice: "Bem-vindo, #{user.nome_display}!"
|
|
else
|
|
flash.now[:alert] = 'PIN inválido ou motorista inativo.'
|
|
@pin_login = true
|
|
render :new, status: :unprocessable_entity
|
|
end
|
|
end
|
|
end
|