TDD — Gestão de acesso no nível de ministério
Status
Section titled “Status”Implementado (piloto no gateway de usuário)
Objetivo
Section titled “Objetivo”Definir modelo técnico de autorização central por perfil para funcionalidades de ministério, com níveis FULL, READ, NONE.
Modelo de dados
Section titled “Modelo de dados”Níveis de acesso
Section titled “Níveis de acesso”| Código | Nome amigável | Semântica |
|---|---|---|
FULL | Completo | Leitura e escrita |
READ | Leitura | Apenas leitura |
NONE | Nenhum | Sem acesso |
Matriz canônica por ministério
Section titled “Matriz canônica por ministério”Documento:
{ "version": 1, "levels": [ { "code": "FULL", "friendlyName": "Completo" }, { "code": "READ", "friendlyName": "Leitura" }, { "code": "NONE", "friendlyName": "Nenhum" } ], "entries": [ { "roleId": "EBD_TEACHER", "resourceId": "USER_PROFILE", "actionId": "GET", "accessLevelCode": "READ", "accessLevelName": "Leitura" } ], "updatedAt": "2026-03-11T00:00:00.000Z", "updatedBy": "system:migration-access-matrix"}Caminho:
platform/ministrys/{ministryId}/data/access_matrix/current
Catálogo canônico de acesso por ministério
Section titled “Catálogo canônico de acesso por ministério”Documento:
{ "version": 1, "resources": [ { "resourceId": "USER_PROFILE", "resourceName": "Perfil do usuário", "actions": [ { "actionId": "GET", "actionName": "Consultar", "mode": "READ" }, { "actionId": "UPDATE", "actionName": "Atualizar", "mode": "WRITE" } ] } ], "updatedAt": "2026-03-11T00:00:00.000Z", "updatedBy": "system:access-catalog"}Caminho:
platform/ministrys/{ministryId}/data/access_catalog/current
Fallback temporário de transição:
platform/ministrys/{ministryId}/data/user_roles/catalog
Regras de resolução
Section titled “Regras de resolução”Entrada:
ministryIdrequesterRoleresourceIdactionId(opcional)
Processo:
- Verificar regra explícita para
resourceId/actionIdno papel atual. - Sem regra, verificar regra de
resourceIdsem ação. - Sem regra, herdar da hierarquia inferior (quem pode mais, pode menos).
- Sem correspondência, retornar
NONE.
Regras adicionais para Relatório EBD
Section titled “Regras adicionais para Relatório EBD”Além da matriz de acesso, o backend deve validar:
- vínculo de classe para ações de assistente/professor;
- vínculo de igreja para ações de superintendente;
- escopo de ministério para ações de secretaria geral/coordenação;
- fase do relatório para permitir ou negar transições.
Regra de fase:
ENVIADObloqueia edição para papéis operacionais;- apenas papéis de governança podem
DEVOLVERouAPROVAR.
Regra combinada (UX + backend)
Section titled “Regra combinada (UX + backend)”Para ações da Home:
visible = roleEligible(minRole) AND matrix>=READcanRead = matrix>=READcanWrite = matrix==FULL
Onde:
roleEligible(minRole)usa hierarquia do catálogo (minRole/minHierarchyLevel);matrixé resolvida porresourceId/actionIddefinidos noaccess_catalog/current.
Contratos de serviço
Section titled “Contratos de serviço”Serviço: RoleCatalogService
resolveAccessLevel(...)canRead(...)canWrite(...)
Contratos de API (gestão da matriz)
Section titled “Contratos de API (gestão da matriz)”Via userGatewayHttp (v1), ações planejadas:
USER_ACCESS_MATRIX_GETUSER_ACCESS_MATRIX_UPDATEUSER_HOME_ACTIONS_ACCESS_GET(consulta de acesso por lista de ações da Home)
Payload esperado:
USER_ACCESS_MATRIX_GET:{}(usa ministério do escopo)USER_ACCESS_MATRIX_UPDATE:{ entries: [...], version, reason? }USER_HOME_ACTIONS_ACCESS_GET:{ items: [{ actionId, resourceId, readActionId, writeActionId? }] }
Resposta de USER_ACCESS_MATRIX_GET inclui:
entriescomresourceNameeactionName(quando disponíveis);catalog.rolespara combos de papel;catalog.resources[].actions[]para combos de recurso/ação;levelspara combos de nível.
Validação de autorização:
- leitura:
resourceId=ACCESS_MATRIX,actionId=GET(mínimoREAD) - escrita:
resourceId=ACCESS_MATRIX,actionId=UPDATE(FULL)
Recursos/Ações de referência para relatório EBD
Section titled “Recursos/Ações de referência para relatório EBD”Recursos:
ATTENDANCELESSONEBDREPORT_WORKFLOW
Ações mínimas:
ATTENDANCE/REGISTERLESSON/LISTLESSON/CLASSES_REPORTEBD/FILL_REPORTEBD/SESSIONS_REPORTEBD/CREATE_SESSIONLESSON/FILL_CLASS_REPORTEBD/SEND_REPORTEBD/RETURN_REPORTEBD/APPROVE_REPORTREPORT_WORKFLOW/GETREPORT_WORKFLOW/UPDATE
Observação:
SEND_REPORT,RETURN_REPORTeAPPROVE_REPORTexigem validação de fase e escopo adicional no backend.CREATE_SESSIONeFILL_CLASS_REPORTdevem ser expostos como ações distintas para separar responsabilidade de sessão vs classe.
Integração piloto atual
Section titled “Integração piloto atual”No ProcessUserActionUseCase, foi aplicada autorização central para ações:
USER_GETUSER_MESSAGES_LISTUSER_ROLES_AVAILABLE_LISTUSER_PROFILE_UPDATEUSER_PREFERENCES_UPDATEUSER_ACTIVE_ROLE_SETUSER_ROLE_REQUESTUSER_ROLE_REQUEST_DELETEUSER_ROLE_REQUEST_APPROVEUSER_ROLE_REQUEST_REJECTUSER_ROLE_REQUESTS_PENDINGUSER_MESSAGE_MARK_READUSER_CHANGE_STATUSUSER_SELF_REGISTER
Cobertura atual e gap
Section titled “Cobertura atual e gap”- Ações do
userGatewayHttpjá passam pelo autorizador central (assertMinistryAccess). - Fluxos com acesso direto do frontend ao Firestore não passam pela matriz no backend.
- Meta de arquitetura: migrar operações críticas para gateway/backend before-write.
Rollout
Section titled “Rollout”Se access_matrix/current ainda não existir para o ministério, o backend usa fallback compatível para não interromper ambientes legados. Ao ativar a matriz canônica, a política passa a ser estrita.
Quando access_catalog/current não existir, o backend pode fornecer nomes amigáveis por fallback temporário interno. A política alvo é eliminar fallback hardcoded no frontend.
Seed operacional da matriz (papéis EBD)
Section titled “Seed operacional da matriz (papéis EBD)”Script operacional deve garantir bootstrap das permissões funcionais para todos os papéis ativos EBD_* no ministério:
ATTENDANCE/REGISTERLESSON/LISTLESSON/CLASSES_REPORTEBD/FILL_REPORTEBD/SESSIONS_REPORT
Requisitos:
- idempotente;
- não sobrescrever entradas existentes;
- manter
access_catalog/currentalinhado com recursos/ações usados no seed.
Testes
Section titled “Testes”Teste de avaliação de acesso via script dedicado:
npm run test:access-control
Referências
Section titled “Referências”docs/architecture/adrs/adr-0026-gestao-central-de-acesso-por-perfil-no-ministerio.mdbackend/functions/src/application/services/role-catalog-service.tsbackend/functions/src/application/use-cases/process-user-action.ts