Arquitetura — canta-igreja
Gerado pelo Architect (Reversa) em 2026-05-11
doc_level: detalhado | Linguagem: TypeScript / React Native 0.84.1
Visão Geral
O canta-igreja é um aplicativo móvel (iOS e Android) com suporte experimental para web, voltado para músicos e cantores de celebrações litúrgicas católicas. Ele fornece:
- Catálogo de cânticos litúrgicos com busca FTS5 (SQLite)
- Gerenciamento local de repertórios musicais
- Calendário litúrgico offline (romcal) + leituras do dia online (API DANCRF)
- Compartilhamento de repertórios via API própria e geração de folhetos PDF
- Player YouTube integrado para audição de músicas
- Biblioteca de obras (hinários) baixáveis
Toda a lógica de dados é 100% local para uso offline, com funcionalidades de rede opcionais (compartilhamento, liturgia online, download de obras).
Pilha de Tecnologias
| Camada |
Tecnologia |
Versão |
Confiança |
| UI Framework |
React Native |
0.84.1 |
🟢 |
| Linguagem |
TypeScript |
— |
🟢 |
| Web support |
react-native-web + Vite |
— |
🟢 |
| Navegação |
React Navigation 7 |
7.x |
🟢 |
| Estado global |
Redux Toolkit (slices + RTK Query) |
2.11.2 |
🟢 |
| Banco de dados |
SQLite via op-sqlite (nativo) / WASM (web) |
15.2.12 |
🟢 |
| Key-value store |
MMKV |
^4.3.1 |
🟢 |
| Autenticação |
Google OAuth 2.0 / PKCE (AppAuth) |
8.1.0 |
🟢 |
| Credenciais nativas |
Keychain / Android Keystore |
10.0.0 |
🟢 |
| Estilos |
Unistyles 3 |
3.2.4 |
🟢 |
| Monitoramento |
Sentry |
8.10.0 |
🟢 |
| Calendário litúrg. |
romcal (Brasil) |
^3.0.0-dev |
🟢 |
| Animações |
Reanimated 4 |
4.3.0 |
🟢 |
Padrões Arquiteturais
Camadas
┌─────────────────────────────────────────────────────────┐
│ View (screens/ + fragment/ + component/ + base/) │
├─────────────────────────────────────────────────────────┤
│ Store (Redux Toolkit — slices, RTK Query, thunks) │
├─────────────────────────────────────────────────────────┤
│ Service (lógica de negócio e orquestração) │
├─────────────────────────────────────────────────────────┤
│ Repository (acesso a dados: SQLite, MMKV, Keychain) │
├─────────────────────────────────────────────────────────┤
│ Model (interfaces TypeScript de domínio) │
└─────────────────────────────────────────────────────────┘
- View: React Native (screens + fragments). Sem lógica de negócio.
- Store: Redux Toolkit. Slices por domínio + RTK Query para APIs externas (Liturgia, Biblioteca).
- Service: Orquestra múltiplos repositórios. Ex.:
RepertorioService, ObraService, CalendarioLiturgicoService.
- Repository: Abstrai acesso ao SQLite, MMKV e Keychain. Isolam o código de persistência.
- Model: Interfaces TypeScript puras. Sem métodos.
- arch/: Infraestrutura transversal — auth, error (Sentry), migrations, estilo, hooks.
Padrões identificados
| Padrão |
Uso |
Confiança |
| Strategy |
3 estratégias de busca (sem termo / por índice / por FTS5) |
🟢 |
| Strategy |
3 estratégias de folheto (slug / base64 / noop) |
🟢 |
| Strategy |
Credenciais: Keychain nativo vs localStorage web |
🟢 |
| Repository |
Camada de persistência isolada por domínio |
🟢 |
| Entity Adapter |
Redux EntityAdapter em Musicas, Repertorios, SugestoesRepertorio |
🟢 |
| RTK Query |
Requisições às APIs REST (Liturgia, Biblioteca) |
🟢 |
| CQRS leve |
Thunks para escrita; seletores/RTK Query para leitura |
🟡 |
| Soft Delete |
data_exclusao em repertorio |
🟢 |
Módulos Funcionais
| Módulo |
Responsabilidade |
Confiança |
musicas |
Busca FTS5, favoritar, visualizar, compartilhar letra |
🟢 |
repertorios |
CRUD local, compartilhar via API, gerar folheto, importar |
🟢 |
livros |
Hinários e edições — filtro na busca |
🟢 |
biblioteca |
Download + import atômico de obras SQLite |
🟢 |
sugestao-repertorio |
Sugestões litúrgicas pré-montadas, sincronização por ATTACH |
🟢 |
liturgia |
Calendário romcal offline + leituras DANCRF online + cache |
🟢 |
auth |
Google OAuth PKCE, token refresh automático |
🟢 |
configuracoes |
Preferências de UI: fonte, tamanho, tema, estilo refrão |
🟢 |
youtube-player |
Player YouTube embarcado com controle de sobreposição |
🟢 |
arch |
Migrations SQLite, sistema de estilos, hooks, error tracking |
🟢 |
Integrações Externas
| Serviço |
Protocolo |
Direção |
Propósito |
Auth |
Confiança |
| canta.app API |
HTTPS REST |
Saída |
Compartilhar repertório, autenticação, obras, slugs |
Bearer (Google) |
🟢 |
| livreto.canta.app |
HTTPS |
Saída (URL) |
Gerar e visualizar folheto PDF do repertório |
Bearer / Base64 |
🟢 |
| API DANCRF |
HTTPS REST |
Saída |
Leituras litúrgicas do dia |
Sem auth |
🟢 |
| YouTube |
WebView |
Saída |
Player de vídeo embarcado (react-native-youtube-iframe) |
Sem auth |
🟢 |
| Airtable |
URL (form) |
Saída |
Formulário de reporte de erros em músicas |
Sem auth |
🟢 |
| Google OAuth |
HTTPS PKCE |
Bidirecional |
Autenticação e emissão de token |
PKCE |
🟢 |
Fluxo de Dados — Busca de Músicas
Usuário digita termo
│
▼
Redux thunk: fetchMusicas(termo, filtros)
│
▼
MusicasRepository.findAllBy()
│
├── Sem termo → SELECT ORDER BY titulo (paginado)
├── Número → WHERE indice = ? (cantico_livro)
└── Texto → FTS5 MATCH com BM25 ranking
│
▼
Resultado paginado → Redux store (EntityAdapter)
│
▼
View (FlatList) renderiza com snippet destacado
Fluxo de Dados — Compartilhamento de Repertório
Usuário toca "Compartilhar"
│
▼
Verificar Auth → se Anônimo: iniciar Google OAuth PKCE
│
▼
POST/PUT canta.app/api/v1/repertorios/{slug}
│
▼
Recebe slug.corrente → persiste localmente
│
▼
Gera mensagem Markdown (WhatsApp-friendly)
│
▼
Share API nativa do SO
Dívidas Técnicas Arquiteturalmente Relevantes
| ID |
Impacto Arquitetural |
Prioridade |
| DT-01 |
Ordenação por cantico_musica.ordem não implementada — resultados potencialmente fora de ordem no livro |
Alta |
| DT-02 |
Busca por índice + livro não funciona corretamente |
Alta |
| DT-03 |
Ciclos PAR/ÍMPAR ausentes no calendário litúrgico — FIXME explícito |
Média |
| DT-08 |
Reordenação de itens de repertório desabilitada na UI |
Média |
| DT-06 |
Auth duplicada em CompartilharService e AcessoAction — sem padronização |
Baixa |
Observações de Segurança (sumário)
| Aspecto |
Status |
| OAuth via PKCE |
🟢 Sem client_secret no app |
| Token (nativo) |
🟢 Keychain / Android Keystore |
| Token (web) |
🟡 localStorage (sem HttpOnly) |
| SQL injection |
🟢 Parametrized queries |
| ATTACH alias (web) |
🟢 Validado por regex antes do ATTACH |
| CRC32 |
🟡 Verificação de atualização apenas — não criptográfico |
Veja também: