TDD — Gestão de permissões (Access Matrix)
Status
Section titled “Status”Planejado
Contexto
Section titled “Contexto”Será adicionada uma interface de gestão de permissões por papel no contexto do ministério, com backend como autoridade.
Documento de dados-alvo:
platform/ministrys/{ministryId}/data/access_matrix/currentplatform/ministrys/{ministryId}/data/access_catalog/current
Objetivo
Section titled “Objetivo”Permitir que usuários autorizados consultem e alterem níveis de acesso (FULL, READ, NONE) por papel/recurso/ação, respeitando a própria matriz.
Entrada da funcionalidade
Section titled “Entrada da funcionalidade”Nova ação na aba Ações da Home:
- ID:
manage_access_matrix - Título:
Gerenciar permissões - Descrição:
Alterar níveis de acesso por perfil
Regras de acesso
Section titled “Regras de acesso”- Para abrir a tela:
ACCESS_MATRIX/GETcom nível mínimoREAD. - Para salvar alterações:
ACCESS_MATRIX/UPDATEcom nívelFULL. - Usuário com apenas
READvisualiza a matriz em modo somente leitura. - Usuário com
NONEnão deve ver a ação e, se tentar acessar por rota direta, backend deve bloquear. - Exibição da ação na Home segue regra híbrida:
minRole/minHierarchyLevel+ matrizREAD|FULL.
Interface de usuário (UI)
Section titled “Interface de usuário (UI)”Estrutura da tela:
- Cabeçalho com ministério, versão e data de atualização.
- Filtros:
- papel (
roleId) - recurso (
resourceId) - texto livre para ação (
actionId)
- papel (
- Grid de permissões:
- linhas: combinações de
roleId + resourceId + actionId - coluna editável: nível amigável (
Completo/Leitura/Nenhum) com persistência emaccessLevelCode
- linhas: combinações de
- Rodapé:
- botão
Descartar - botão
Salvar alterações(habilitado somente quando há diff + permissão de escrita)
- botão
Fluxo técnico
Section titled “Fluxo técnico”- Home -> ação
manage_access_matrix-> abre página de gestão. - Frontend chama
USER_ACCESS_MATRIX_GET. - Backend retorna matriz + metadados (
version,updatedAt,updatedBy) e catálogo para a UI (roles,resources,actions,levels). - Usuário altera células da grade.
- Frontend monta diff e chama
USER_ACCESS_MATRIX_UPDATE. - Backend valida permissão de escrita, normaliza dados e persiste
current. - Frontend recarrega matriz e exibe confirmação.
Impacto em UX da Home
Section titled “Impacto em UX da Home”Mudanças na matriz devem refletir na aba Ações:
NONEremove o card da lista;READmantém card visível para operações de leitura;FULLmantém card visível e habilita escrita quando aplicável.
Contratos planejados
Section titled “Contratos planejados”USER_ACCESS_MATRIX_GET
Section titled “USER_ACCESS_MATRIX_GET”Request:
{ "version": "v1", "action": "USER_ACCESS_MATRIX_GET", "payload": {}, "meta": { "request_id": "..." }}Response (data):
{ "version": 1, "levels": [ { "code": "FULL", "friendlyName": "Completo" }, { "code": "READ", "friendlyName": "Leitura" }, { "code": "NONE", "friendlyName": "Nenhum" } ], "entries": [], "updatedAt": "2026-03-11T00:00:00.000Z", "updatedBy": "system"}Cada item de entries pode incluir:
resourceNameactionName
O payload inclui também:
{ "catalog": { "roles": [ { "roleId": "EBD_SECRETARY", "roleDescription": "Secretário EBD", "hierarchyLevel": 50 } ], "resources": [ { "resourceId": "LESSON", "resourceName": "Classes e aulas", "actions": [ { "actionId": "LIST", "actionName": "Listar minhas aulas", "mode": "READ" } ] } ] }}USER_ACCESS_MATRIX_UPDATE
Section titled “USER_ACCESS_MATRIX_UPDATE”Request (payload):
{ "version": 1, "entries": [ { "roleId": "EBD_TEACHER", "resourceId": "USER_PROFILE", "actionId": "GET", "accessLevelCode": "READ", "accessLevelName": "Leitura" } ], "reason": "Ajuste de governança"}Regras:
- normalizar para uppercase em
roleId/resourceId/actionId/accessLevelCode; - validar
accessLevelCodeem{FULL, READ, NONE}; - deduplicar por chave
(roleId, resourceId, actionId?); - atualizar
updatedAt/updatedBy. - permitir criação e remoção de entradas pela UI, mantendo persistência via envio completo de
entries.
Erros esperados
Section titled “Erros esperados”FORBIDDEN_ACCESS_LEVEL— sem permissão para ler/escrever a matriz.INVALID_PAYLOAD— estrutura inválida.FORBIDDEN_SCOPE_MISMATCH— tentativa fora do ministério do ator.
Testes necessários
Section titled “Testes necessários”Backend:
- GET com
READretorna matriz. - GET com
NONEbloqueia. - UPDATE com
FULLpersiste. - UPDATE com
READbloqueia. - validação/deduplicação de payload.
Frontend:
- ação visível só quando autorizado.
- modo read-only sem botão salvar.
- diff aplicado corretamente.
- feedback de sucesso/erro após salvar.
- renderização da grade com nome amigável (sem exibir código técnico para usuário final).
- inclusão de nova linha (
papel + recurso + ação + nível) usando catálogo retornado pelo backend. - prevenção de duplicidade de chave
(roleId, resourceId, actionId)ao incluir linha. - remoção de linha da matriz antes do salvar.
Seed inicial obrigatório (cargos EBD)
Section titled “Seed inicial obrigatório (cargos EBD)”O bootstrap da matriz deve criar entradas faltantes para todos os papéis EBD_* ativos no catálogo do ministério, sem sobrescrever entradas já existentes:
ATTENDANCE/REGISTERLESSON/LISTLESSON/CLASSES_REPORTEBD/FILL_REPORTEBD/SESSIONS_REPORT
Critério:
- idempotente (não duplica);
- não altera customização existente;
- níveis iniciais por faixa hierárquica (ex.: professor e acima para relatórios/preenchimento; aluno com leitura básica e/ou
NONEexplícito onde aplicável).
Nota de domínio — Relatório EBD
Section titled “Nota de domínio — Relatório EBD”A matriz controla elegibilidade de funcionalidade, porém não substitui regras de negócio do relatório:
- assistente/professor operam somente em classes onde possuem vínculo;
- superintendente opera no escopo da igreja sob responsabilidade;
- secretaria geral/coordenação podem devolver/aprovar;
- relatório enviado não é editável por papéis operacionais.
Referências
Section titled “Referências”docs/architecture/adrs/adr-0026-gestao-central-de-acesso-por-perfil-no-ministerio.mddocs/architecture/tdd/api/tdd-gestao-acesso-ministerio.md