Skip to content

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