You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Lumen+ — Plataforma de Gestão para Comunidades Católicas
Sistema completo para comunidades católicas: gestão de membros, hierarquia organizacional, retiros, formação espiritual e comunicação interna. Disponível para iOS, Android e Web.
Coordenadores enviam convites para usuários por e-mail
Usuários aceitam ou rejeitam convites recebidos
Histórico de convites (pendente, aceito, rejeitado, expirado, cancelado)
Notificação via inbox ao receber convite
Inbox (Mensageria Interna)
Mensagens de coordenadores para membros, unidades ou papéis
Filtros de destinatário: todos, por realidade vocacional, estado de vida, cidade, estado
Preview de destinatários antes do envio
Contador de não lidas em tempo real
Tipos de mensagem: info, aviso, sucesso, urgente
Módulo de Retiros
Criação de retiros com nome, datas, local, capacidade e descrição
Tipos de participação: Participante ou Equipe de Serviço
Múltiplos tipos de taxa por retiro (inscrição, hospedagem, alimentação, etc.)
Casas de acomodação com capacidade configurável
Regras de elegibilidade separadas para participantes e equipe
Inscrição com upload de comprovante de pagamento
Confirmação/rejeição de inscrições pelo coordenador
Equipes de serviço por função e retiro
Painel de gestão com visão geral de inscrições e vagas
Projeto de Vida
Plano espiritual personalizado guiado por um wizard de 8 etapas:
Realidade Vocacional — estado de vida atual (Leigo, Seminarista, Sacerdote, etc.)
Diagnóstico — reflexão em 5 dimensões: Humana, Espiritual, Comunitária, Intelectual e Apostólica (3 perguntas por dimensão)
Síntese — defeito dominante, virtudes a cultivar e outras devoções
Objetivo Principal — título e descrição do foco do ciclo
Meios Concretos — ações específicas com frequência e contexto
Rotina Espiritual — tipos de oração (multi-seleção), frequência da Missa e da Confissão, exame de consciência
Diretor Espiritual — nome e frequência de encontros
Confirmar — revisão completa antes de salvar como rascunho
Após a criação, o usuário ativa o plano; ciclos ativos permitem revisões mensais com registro de progresso, dificuldades, constância e decisão (manter, ajustar objetivo, encerrar ciclo). O histórico preserva todos os ciclos arquivados.
Formação Espiritual
Bíblia (Sagradas Escrituras): Versículo do Dia determinístico e leitor por livro/capítulo/versículo
Catecismo da Igreja Católica: 2.537 parágrafos (§1–§2557), leitura paginada (30 §/página), busca por palavra e navegação por número de parágrafo
Leitor com contexto (parágrafos vizinhos), controle de tamanho de fonte e breadcrumb hierárquico
Administração
Listagem e edição de todos os usuários
Atribuição de papéis globais (DEV, ADMIN, ANALISTA, COORDINATOR)
Acesso controlado a documentos sensíveis (CPF/RG) com fluxo request/approve e auditoria
Criação e gestão de avisos (inbox massivo)
Histórico de avisos enviados
Logs de auditoria filtráveis por ação, entidade e usuário
Gestão completa de retiros (criar, editar, publicar, gerenciar inscrições)
Segurança e Conformidade
CPF e RG criptografados com AES-256-GCM antes de armazenar
HMAC-SHA256 para busca de CPF sem exposição do dado real
Rate limiting por IP (por minuto e por hora)
Request ID em todas as requisições para rastreabilidade
Logs estruturados com Structlog
Monitoramento de erros com Sentry (configurado sem envio de PII — LGPD)
Swagger UI disponível apenas em ambiente de desenvolvimento
AUTH_MODE=DEV: aceita tokens no formato Bearer dev:<uid>:<email> sem validação Firebase.
ENABLE_DEV_ENDPOINTS=true: habilita rotas /dev/* (seed, criação de roles, reset).
DEBUG_VERIFICATION_CODE=true: retorna o código de verificação telefônica na resposta da API.
Backend — Produção
ENVIRONMENT=productionAUTH_MODE=PRODENABLE_DEV_ENDPOINTS=falseDEBUG_VERIFICATION_CODE=falseDATABASE_URL=postgresql+psycopg://usuario:senha@host:5432/lumen_dbREDIS_URL=redis://host:6379/0SECRET_KEY=<string-aleatória-longa-32+-chars>ENCRYPTION_KEY=<base64-de-32-bytes># AES-256-GCM para CPF/RGHMAC_PEPPER=<base64-de-32-bytes># HMAC-SHA256 para busca de CPFFIREBASE_PROJECT_ID=<seu-projeto-firebase>CORS_ORIGINS=https://seuapp.com# Opcional — monitoramento de errosSENTRY_DSN=https://...@sentry.io/...# Opcional — upload de imagensCLOUDINARY_CLOUD_NAME=...CLOUDINARY_API_KEY=...CLOUDINARY_API_SECRET=...
Mobile
EXPO_PUBLIC_API_URL=https://api.seudominio.com
API — Referência
A documentação interativa (Swagger UI) está disponível em /docs no modo desenvolvimento.
Autenticação
Método
Rota
Descrição
POST
/auth/register
Cadastrar novo usuário
POST
/auth/login
Login (retorna token Firebase)
GET
/auth/me
Dados do usuário autenticado
DELETE
/auth/me
Excluir conta
Perfil
Método
Rota
Descrição
GET
/profile
Buscar perfil com labels resolvidos
PUT
/profile
Criar ou atualizar perfil
GET
/profile/catalogs
Opções de catálogos (estado de vida, civil, vocacional)
POST
/profile/emergency-contact
Adicionar/atualizar contato de emergência
GET
/profile/emergency-contacts
Listar contatos de emergência
Organização
Método
Rota
Descrição
GET
/org/tree
Árvore organizacional completa
GET
/org/ministries
Lista plana de ministérios
POST
/org/units/{id}/children
Criar unidade filha
GET
/org/units/{id}/members
Listar membros de uma unidade
POST
/org/units/{id}/invites
Enviar convite para membro
POST
/org/invites/{id}/accept
Aceitar convite
POST
/org/invites/{id}/reject
Rejeitar convite
GET
/org/my/invites
Meus convites pendentes
GET
/org/my/memberships
Minhas associações ativas
Verificação
Método
Rota
Descrição
POST
/verify/phone/start
Iniciar verificação por telefone
POST
/verify/phone/confirm
Confirmar código de telefone
POST
/verify/email/start
Iniciar verificação por e-mail
POST
/verify/email/confirm
Confirmar token de e-mail
Inbox
Método
Rota
Descrição
GET
/inbox
Listar mensagens recebidas
GET
/inbox/unread
Contagem de não lidas
PATCH
/inbox/{id}/read
Marcar como lida
POST
/inbox/send
Enviar mensagem
POST
/inbox/send/preview
Pré-visualizar destinatários
GET
/inbox/send/scopes
Escopos de envio disponíveis
Legal
Método
Rota
Descrição
GET
/legal/latest
Termos e Política vigentes
POST
/legal/accept
Registrar aceite
Retiros
Método
Rota
Descrição
GET
/retreats
Listar retiros disponíveis
GET
/retreats/{id}
Detalhes do retiro
POST
/retreats/{id}/register
Inscrever-se no retiro
DELETE
/retreats/{id}/my-registration
Cancelar inscrição
POST
/retreats/{id}/my-registration/payment
Enviar comprovante de pagamento
Admin
Método
Rota
Descrição
GET
/admin/users
Listar todos os usuários
PATCH
/admin/users/{id}
Editar usuário (papéis, status)
GET
/admin/users/{id}/documents
Ver CPF/RG (requer aprovação)
GET
/admin/sensitive-access/pending
Solicitações de acesso pendentes
POST
/admin/sensitive-access/{id}/approve
Aprovar acesso a documentos
GET
/admin/audit-logs
Logs de auditoria
POST
/admin/retreats
Criar retiro
PATCH
/admin/retreats/{id}
Atualizar retiro
GET
/admin/retreats/{id}/registrations
Listar inscritos
POST
/admin/retreats/{id}/registrations/{rid}/confirm
Confirmar inscrição
Desenvolvimento (apenas ENABLE_DEV_ENDPOINTS=true)
Método
Rota
Descrição
POST
/dev/seed
Popular dados iniciais (papéis, docs legais)
POST
/dev/assign-global-role
Atribuir papel global a um usuário
POST
/dev/org-units
Criar unidades organizacionais de teste
Banco de Dados
Principais Entidades
Tabela
Descrição
users
Contas de usuário com múltiplas identidades
user_identities
Credenciais por provedor (Firebase)
user_profiles
Perfil completo com dados vocacionais, documentos criptografados e preferências
user_emergency_contacts
Contatos de emergência (1 por usuário)
org_units
Hierarquia organizacional (5 níveis)
org_memberships
Vínculos usuário × unidade organizacional
org_invites
Convites de ingresso em unidades
org_roles
Definição de papéis (COORDINATOR, MEMBER, ADMIN, ANALISTA)
user_global_roles
Papéis globais do sistema
inbox_messages
Mensagens internas
inbox_recipients
Destinatários de mensagens com status de leitura
legal_documents
Termos e Política de Privacidade (versionados)
user_legal_acceptances
Registro de aceites com timestamp
retreats
Retiros com datas, vagas, taxas e regras de elegibilidade
retreat_registrations
Inscrições em retiros
retreat_houses
Casas/acomodações por retiro
retreat_fees
Taxas por tipo de participação
retreat_service_teams
Equipes de serviço por função
profile_catalogs
Catálogos de opções (estado de vida, civil, vocacional)
profile_catalog_items
Itens dos catálogos
audit_logs
Registro de ações para conformidade
Criptografia de Documentos
CPF e RG são tratados com duas camadas:
cpf_hash: HMAC-SHA256 com pepper — permite busca sem expor o dado
cpf_encrypted / rg_encrypted: AES-256-GCM — armazenamento reversível para exibição autorizada
O acesso administrativo a CPF/RG exige solicitação formal, aprovação por outro admin e fica registrado no audit log.
Migrações
# Aplicar todas as migrações pendentes
alembic upgrade head
# Verificar estado atual
alembic current
# Criar nova migração com autogenerate
alembic revision --autogenerate -m "descricao_da_mudanca"# Reverter última migração
alembic downgrade -1
Histórico de migrações em backend/alembic/versions/ (26 migrações, 001 → 026).
Testes
cd backend
pytest # Todos os testes
pytest tests/test_profile.py # Módulo específico
pytest -v # Verbose
pytest --cov=app # Com cobertura
O docker-compose.yml sobe PostgreSQL, Redis e o backend com alembic upgrade head automático no start.
Railway / Render / Fly.io
Configure as variáveis de ambiente de produção (ver seção acima)
O Procfile / railway.toml aponta para uvicorn app.main:app --host 0.0.0.0
Execute alembic upgrade head como release command
Setup Inicial de Produção (uma vez)
# 1. Criar dados base (papéis, docs legais)
POST /dev/seed # apenas com ENABLE_DEV_ENDPOINTS=true temporariamente# 2. Atribuir papel DEV ao primeiro usuário
POST /dev/assign-global-role { "user_id": "...", "role": "DEV" }
# 3. Criar Conselho Geral (raiz da hierarquia)
POST /org/units { "name": "Conselho Geral", "type": "CONSELHO_GERAL" }
# 4. Desabilitar endpoints de desenvolvimento
ENABLE_DEV_ENDPOINTS=false