Repertórios — Decisões de Design
Gerado pelo Writer (Reversa) em 2026-05-11
doc_level: detalhado
DEC-01: Ordem dos itens armazenada como JSON array no cabeçalho do repertório
Contexto: A ordem de exibição dos itens de um repertório precisa ser controlada pelo usuário, independente da ordem de inserção na tabela item_repertorio.
Decisão: O campo ordem_musicas TEXT DEFAULT '[]' no registro do repertório armazena um array JSON de id_item_repertorio na ordem desejada. Toda operação de adicionar, remover ou reordenar itens atualiza este campo atomicamente.
Alternativas descartadas:
- Coluna
posicao INTEGERemitem_repertorio— exigiria UPDATE em N linhas a cada reordenação; sujeito a inconsistências. - Ordenação por
data_criacao— não reflete intenção do usuário.
Consequências:
- ✅ Reordenação em uma única operação de UPDATE no cabeçalho 🟢
- ✅ Consulta de itens em ordem correta requer deserialização do JSON no cliente 🟢
- ⚠️ Se o array ficar dessincronizado com os itens reais, a ordem pode conter IDs obsoletos 🟡
Confiança: 🟢 — confirmado em Repertorio.ts + migration v8.
DEC-02: Soft-delete em vez de exclusão física
Contexto: Repertórios excluídos pelo usuário precisam sumir da interface, mas a equipe considerou a possibilidade de sincronização futura com a API.
Decisão: Ao excluir um repertório, o campo data_exclusao é preenchido com o timestamp atual. Consultas de listagem filtram com WHERE data_exclusao IS NULL.
Alternativas descartadas:
- DELETE físico — irreversível; impede rastreamento de exclusões para sincronização futura.
Consequências:
- ✅ Repertórios excluídos permanecem no banco para auditoria ou recuperação futura 🟡
- ⚠️ Sem purga periódica, o banco pode acumular registros inativos ao longo do tempo 🟡
Confiança: 🟢 — confirmado em deactivateRepertorio + migration v8.
DEC-03: Dual slug (referencia + corrente) para rastreamento de origem
Contexto: Um usuário pode importar um repertório de outra conta e depois re-compartilhá-lo. O slug do compartilhamento original deve ser preservado para rastreamento de proveniência.
Decisão: O repertório tem dois campos de slug:
slug_referencia: slug original de quem criou o repertório (nunca muda após importação)slug_corrente: slug do último compartilhamento pelo dono atual
Alternativas descartadas:
- Um único campo
slug— perderia a informação de origem ao re-compartilhar.
Consequências:
- ✅ Proveniência rastreável; importações futuras do mesmo slug são deduplicadas 🟢
- ⚠️ Lógica de comparação de slugs precisa considerar ambos os campos 🟢
Confiança: 🟢 — confirmado em RepertorioSlug + CompartilharService.
DEC-04: Múltiplas estratégias para geração de folheto (Strategy Pattern)
Contexto: Gerar um folheto PDF requer enviar o repertório para a API, o que depende de autenticação. O sistema precisa degradar graciosamente quando o usuário não está logado ou quando a API está indisponível.
Decisão: FolhetoService usa o padrão Strategy com três implementações:
GerarFolhetoComSlugStrategy— autentica + POST à API + abre link com slugGerarFolhetoBase64Strategy— serializa para Base64 + abre link sem autenticaçãoGerarFolhetoNoopStrategy— sem ação (fallback seguro)
Consequências:
- ✅ Degradação graciosa: Base64 funciona mesmo sem conta 🟢
- ✅ Estratégia selecionável em runtime conforme contexto 🟢
- ⚠️ URLs com Base64 podem ser longas demais para alguns clientes HTTP 🟡
Confiança: 🟢 — confirmado em FolhetoService.ts.
DEC-05: Reordenação de itens temporariamente desabilitada (DT-08)
Contexto: A UI de reordenação de itens foi implementada, mas a biblioteca de reordenação (react-native-reorderable-list) apresentou instabilidades após upgrades do React Native.
Decisão: O botão de reordenação foi desabilitado na UI com o commit fix(repertorio): desabilitado reordenação por enquanto. A lógica de ordem_musicas permanece íntegra no backend.
Status: Dívida técnica ativa (DT-08). A reabilitação depende de uma versão estável da biblioteca de reordenação compatível com React Native 0.84+.
Confiança: 🟢 — confirmado via commit mensagem.
DEC-06: Mensagem de compartilhamento em Markdown compatível com WhatsApp
Contexto: O principal canal de compartilhamento de repertórios é o WhatsApp, que suporta um subconjunto limitado de Markdown (negrito, itálico, código inline).
Decisão: gerarMensagemCompartilhamento formata a mensagem usando apenas os marcadores suportados pelo WhatsApp: *texto* (negrito), _texto_ (itálico), `código` (monoespacado). Markdown de tabelas e títulos são evitados.
Confiança: 🟢 — confirmado em RepertorioService.ts + commit feat(share music): improve whastsapp markdown support.