Baixar Obra — Design Técnico
Gerado pelo Writer (Reversa) em 2026-05-11
Interface
// ObraService
async baixarObra(obra: Obra): Promise<string> // retorna cachePath
// BibliotecaRepository
static async importarObra(obra: Obra, path: string): Promise<ExemplarBiblioteca>
Fluxo Principal
BibliotecaAction.baixarObra(obra)chamanew ObraService().baixarObra(obra)- Guard:
downloadEmAndamento = true; lança erro se já ativo baixarArquivo(Api.APP_BIBLIOTECA_OBRAS_SQLITE(obra), cachePath(id_obra.db))— download do arquivodownloadEmAndamento = falseemfinallyBibliotecaRepository.importarObra(obra, path):Banco.attachFromCache('{id_obra}.db', 'toImport')upsertMusicas— INSERT ON CONFLICT baseado em CRC32- Em paralelo:
upsertLivroEditoraEdicaoLivro+upsertCanticoLivro+deleteCreateSecaoLivroCanticoSecao disableExemplarObra([])→createExemplarObra([id_obra, titulo, descricao, crc32])Banco.detach('toImport')emfinally
Dependências
baixarArquivoecachePath—src/arch/util/fsBanco.attachFromCache,Banco.detach,Banco.execute—src/arch/persistence/BancoApi.APP_BIBLIOTECA_OBRAS_SQLITE— URL do arquivo SQLite da obra
Riscos e Lacunas
- 🔴
disableExemplarObrachamado com[]sem parâmetroid_obra— bug potencial (ver EC-05 de edge-cases.md) - 🟡 Arquivo corrompido em cache não é limpo após falha de importação
- 🟡 Sem verificação de integridade do arquivo baixado antes de ATTACH