Skip to content

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

  1. BibliotecaAction.baixarObra(obra) chama new ObraService().baixarObra(obra)
  2. Guard: downloadEmAndamento = true; lança erro se já ativo
  3. baixarArquivo(Api.APP_BIBLIOTECA_OBRAS_SQLITE(obra), cachePath(id_obra.db)) — download do arquivo
  4. downloadEmAndamento = false em finally
  5. BibliotecaRepository.importarObra(obra, path):
  6. Banco.attachFromCache('{id_obra}.db', 'toImport')
  7. upsertMusicas — INSERT ON CONFLICT baseado em CRC32
  8. Em paralelo: upsertLivroEditoraEdicaoLivro + upsertCanticoLivro + deleteCreateSecaoLivroCanticoSecao
  9. disableExemplarObra([])createExemplarObra([id_obra, titulo, descricao, crc32])
  10. Banco.detach('toImport') em finally

Dependências

  • baixarArquivo e cachePathsrc/arch/util/fs
  • Banco.attachFromCache, Banco.detach, Banco.executesrc/arch/persistence/Banco
  • Api.APP_BIBLIOTECA_OBRAS_SQLITE — URL do arquivo SQLite da obra

Riscos e Lacunas

  • 🔴 disableExemplarObra chamado com [] sem parâmetro id_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