Files
Reem-Notas/app/policies/user_policy.rb

40 lines
1.5 KiB
Ruby

# 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