# app/controllers/application_controller.rb class ApplicationController < ActionController::Base include Pundit::Authorization include Pagy::Backend before_action :authenticate_user! before_action :set_tema before_action :preparar_splash # Pundit: redireciona se não autorizado. # # ⚠️ NÃO redirecione para `root_path` aqui: a raiz é o dashboard, e um perfil # sem `dashboard.ver` entraria em loop (nega → raiz → nega). O destino é a # primeira tela que a PESSOA pode abrir; quem não pode abrir nenhuma vai para a # tela de sem-acesso, que explica a quem pedir. rescue_from Pundit::NotAuthorizedError do |_e| flash[:alert] = 'Você não tem permissão para acessar essa área.' redirect_to destino_permitido end private # Rota inicial deste usuário (ver User#home_rota). `sem_acesso_path` é o fim de # linha: perfil sem nenhuma permissão. def destino_permitido rota = current_user&.home_rota return sem_acesso_path if rota.nil? # Evita loop quando a própria tela negada é a home calculada. destino = public_send(rota) destino == request.path ? sem_acesso_path : destino end helper_method :destino_permitido def set_tema @tema = current_user&.tema_preferido || 'dark' end # Mostra a animação de abertura uma única vez, na primeira página HTML após o # login. O flag é gravado em #after_sign_in_path_for (Devise) e nos logins do # motorista (PIN/QR); aqui ele é lido e apagado (one-shot). def preparar_splash return unless request.get? && request.format.html? @mostrar_splash = session.delete(:mostrar_splash) end # Mesma regra do Users::SessionsController: o destino é a primeira tela que o # PERFIL da pessoa permite, não uma rota fixa por papel. def after_sign_in_path_for(resource) session[:mostrar_splash] = true rota = resource.home_rota rota ? public_send(rota) : sem_acesso_path end end