Sistema RBAC (Role-Based Access Control)
Cada usuario tem exatamente UM cargo. O cargo define suas permissoes no sistema. O Portal possui 6 cargos hierarquicos.
Cargos
| Cargo | Descricao |
|---|---|
| MEMBRO | Usuario base. Pode participar de eventos, completar tarefas, comprar na loja, votar em enquetes. |
| LIDER_PROJETO | Membro promovido para liderar um projeto especifico. Cria e valida tarefas DENTRO do seu projeto. |
| PORTA_VOZ | Membro com permissoes de comunicacao. Pode criar comunicados, enquetes, enviar emails, criar tarefas (incluindo avulsas) e usar o Assistente IA. |
| COORDENADOR | Gerencia o nucleo. Cria projetos, eventos, comunicados. Aprova cadastros. Gerencia loja e financeiro. Usa IA (somente leitura). |
| ADMINISTRADOR | Acesso total ao nucleo. Tudo do Coordenador + alterar cargos, ajustar CC, configuracoes globais, acoes de escrita via IA, porta-vozes. |
| SUPER_ADMIN | Acesso irrestrito a TODOS os nucleos. Nao pertence a nenhum nucleo especifico. Pode criar nucleos, criar outros Super Admins, modo Nacional. |
Matriz de Permissoes Completa
| Funcionalidade | Membro | Lider | Porta-Voz | Coord | Admin | Super Admin |
|---|---|---|---|---|---|---|
| Login / Dashboard | Sim | Sim | Sim | Sim | Sim | Sim |
| Editar proprio perfil | Sim | Sim | Sim | Sim | Sim | Sim |
| Ver perfil de outros | Basico | Membros do projeto | Basico | Completo | Completo | Completo |
| Aprovar cadastros | - | - | - | Sim | Sim | Sim |
| Alterar cargos | - | - | - | - | Sim | Sim |
| Criar projetos | - | - | - | Sim | Sim | Sim |
| Criar comunicados | - | - | Sim | Sim | Sim | Sim |
| Criar enquetes | - | - | Sim | Sim | Sim | Sim |
| Enviar emails | - | - | Sim | Sim | Sim | Sim |
| Criar tarefas | - | No seu projeto | Sim (inc. avulsas) | Sim | Sim | Sim |
| Validar tarefas | - | No seu projeto | - | Sim | Sim | Sim |
| Criar eventos | - | - | - | Sim | Sim | Sim |
| Check-in em eventos | - | - | - | Sim | Sim | Sim |
| Comprar na loja | Sim | Sim | Sim | Sim | Sim | - |
| Gerenciar loja | - | - | - | Sim | Sim | Sim |
| Usar IA (chat) — leitura | - | - | Sim | Sim | Sim | Sim |
| IA — acoes de escrita | - | - | - | - | Sim | Sim |
| Ajustar saldo CC | - | - | - | - | Sim | Sim |
| Lancamentos financeiros | - | - | - | Sim | Sim | Sim |
| Configuracoes globais | - | - | - | - | Sim | Sim |
| Gerenciar porta-vozes | - | - | - | - | Sim | Sim |
| Criar nucleos | - | - | - | - | - | Sim |
| Modo Nacional | - | - | - | - | - | Sim |
| Relatorios globais | - | - | - | - | - | Sim |
| Criar Super Admins | - | - | - | - | - | Sim |
| Produtos Nacional | Ver/Comprar | Ver/Comprar | Ver/Comprar | Ver/Comprar | Ver/Comprar | Gerenciar |
| Comunicados Nacional | Ver | Ver | Ver | Ver | Ver | Criar |
| Enquetes Nacional | Votar | Votar | Votar | Votar | Votar | Criar |
Implementacao Tecnica
Backend (NestJS)
Guards aplicados nos controllers:
// Proteger endpoint para Coord/Admin
@UseGuards(AuthGuard, RolesGuard)
@Roles('COORDENADOR', 'ADMINISTRADOR')
@Post('approve')
approve(@Body() dto: ApproveRejectDto) { ... }
// Proteger endpoint apenas para Admin
@UseGuards(AuthGuard, RolesGuard)
@Roles('ADMINISTRADOR')
@Patch(':id/cargo')
updateCargo(...) { ... }
// Proteger endpoint para Porta-Voz, Coord e Admin
@UseGuards(AuthGuard, RolesGuard)
@Roles('PORTA_VOZ', 'COORDENADOR', 'ADMINISTRADOR')
@Post('comunicados')
createComunicado(...) { ... }
// Proteger endpoint apenas para Super Admin
@UseGuards(AuthGuard, RolesGuard)
@Roles('SUPER_ADMIN')
@Post('nucleos')
createNucleo(...) { ... }Frontend (Next.js)
Sidebar filtra itens de menu pelo cargo do usuario:
const visibleItems = menuItems.filter(
(item) => item.roles.includes(cargo)
);O cargo PORTA_VOZ tem acesso aos menus de comunicacao (Comunicados, Enquetes, Emails) e ao Assistente IA, mas nao aos menus administrativos (Membros, Aprovacoes, Configuracoes).
Banco (RLS)
Row Level Security garante isolamento no nivel do banco. Mesmo que um endpoint seja acessado diretamente, o usuario so ve dados do seu nucleo.
Super Admin e Multi-tenant
O Super Admin nao tem nucleo_id fixo. Ao selecionar um nucleo no dropdown do header, o frontend envia X-Tenant-ID no header de todas as requisicoes, permitindo que o backend aplique o contexto multi-tenant correto.