Liturgia — Design Técnico
Gerado pelo Writer (Reversa) em 2026-05-11
doc_level: detalhado
Arquitetura do Módulo
LiturgiaDoDiaScreen
└── LeituraDiaView (fragment)
└── useGetLiturgiaPorDataQuery(data) ← RTK Query
├── LiturgiaCacheRepository.findFresh ← cache SQLite 24h
├── DANCRF API GET /api/v3/ ← rede
└── LiturgiaCacheRepository.save ← persistir
└── pruneStale() ← limpeza assíncrona
CalendarioLiturgicoService ← usado por sugestao-repertorio
├── cache: Map<ano, DiaLiturgico[]> ← memória (não persiste)
└── romcal.generateCalendar(ano) ← offline, Brazil_PtBr
RTK Query — LiturgiaApi
baseQuery: fetchBaseQuery({ baseUrl: Api.Parceiros.LITURGIA })
refetchOnReconnect: true
endpoint: getLiturgiaPorData(data: DateString) → LiturgiaDiaDancrf | null
queryFn:
1. LiturgiaCacheRepository.findFresh(data) → se hit: return cache
2. fetchWithBQ(`?dia=DD&mes=MM&ano=YYYY`)
3. se 404: return { data: null }
4. se outro erro: findFresh(stale) → return cache; ou return error
5. DancrfMapper.map(response, data) → LiturgiaDiaDancrf
6. LiturgiaCacheRepository.save(liturgia) → UPSERT SQLite
7. pruneStale() → async, sem await
8. return data
Cache SQLite — liturgia_cache
| Coluna |
Tipo |
Observação |
data |
TEXT |
PK — YYYY-MM-DD |
payload |
TEXT |
JSON serializado de LiturgiaDiaDancrf |
atualizado_em |
INTEGER |
Timestamp ms |
- TTL:
24h (TTL_UM_DIA_MS)
- Purge:
>= 365 dias via pruneStale
- UPSERT via
ON CONFLICT(data) DO UPDATE SET …
CalendarioLiturgicoService
| Método |
Assinatura |
Cache |
getCalendariosLiturgicos |
() → Map<ChaveCicloLiturgico, DiaLiturgico> |
Em memória por ano |
getCalendario (private) |
(ano) → DiaLiturgico[] |
Map<ano, DiaLiturgico[]> |
getDiasLiturgicosPorData |
(data: DateString) → DiaLiturgico[] |
Via getCalendario |
getDiasLiturgicosPorMes |
(ano, mes) → DiaLiturgico[] |
Via getCalendario |
Enriquecimento DiaLiturgico
interface DiaLiturgico {
idRomcal: IdRomcal;
nome: string; // resolvido com `resolverNomeRomcal` (i18n nesting fix)
data: DateString;
cicloLiturgico?: 'A' | 'B' | 'C';
cor?: CorLiturgica; // from d.colors[0]
tempoLiturgico?: TempoLiturgico;
}
ChaveCicloLiturgico
Formato: "${CicloLiturgico}:${idRomcal}" ou apenas "${idRomcal}" (sem ciclo).
Definida em SugestaoRepertorio.ts, usada por ambos os módulos.
Mapeamento CorLiturgica ↔ DANCRF
| DANCRF (string) |
CorLiturgica enum |
'Verde' |
GREEN |
'Vermelho' |
RED |
'Roxo' |
PURPLE |
'Rosa' |
ROSE |
'Branco' |
WHITE |
| default |
DESCONHECIDO |
Riscos e Lacunas
- 🟡 Cache em memória do romcal não persiste — a primeira renderização de qualquer tela que use
CalendarioLiturgicoService faz a computação completa de 2 anos
- 🟡
resolverNomeRomcal: referência circular prevenida mas apenas com 1 nível de indireção — loop profundo possível (improvável)
- 🟡 API DANCRF retorna dia/mês/ano como query params — format breakdown if
DateString malformada
- 🔴 FIXME no código:
extrairCicloLiturgico tem comentário "Aceitar par/ímpar" incompleto — comportamento indefinido para anos pares/ímpares de leitura