# app/policies/user_policy.rb class UserPolicy < ApplicationPolicy def index? = pode?('admin.usuarios') # Cada um enxerga a própria ficha (é assim que a tela de perfil pessoal # funciona), além de quem administra usuários. def show? = pode?('admin.usuarios') || record == user def create? = pode?('admin.usuarios_gerenciar') def new? = create? # ⚠️ `record == user` CONTINUA aqui de propósito: é o que permite alguém editar # o próprio cadastro (nome, senha). O que NÃO pode é essa mesma pessoa mudar o # próprio papel/perfil e se promover — isso é barrado em #alterar_acesso?, que # o controller usa para decidir quais campos aceita. def update? = pode?('admin.usuarios_gerenciar') || record == user def edit? = update? def destroy? = create? && record != user def toggle_ativo? = create? && record != user # Pode mexer no TIPO DE CONTA e no PERFIL DE ACESSO de alguém? Nunca no # próprio: senão qualquer usuário se promove editando a própria ficha. def alterar_acesso? = pode?('admin.usuarios_gerenciar') && record != user class Scope < Scope def resolve # Continua por papel: filtrar por permissão exigiria carregar o perfil de # cada linha (N+1) para responder algo que a policy já cobre na ação. if user.admin? scope.all elsif user.pode?('admin.usuarios') scope.where.not(role: :admin) else scope.where(id: user.id) end end end end