5.1 KiB
Prompt 02 — Migrations do db_master
Contexto
O Prompt 01 já entregou: projeto Java rodando em Docker, HttpServer no ar, MigrationRunner pronto pra rodar arquivos .sql, DataSourceProvider com conexão ao db_master. Leia o tracker (10-tracker-progresso.md) antes de começar para confirmar que o Prompt 01 está marcado como concluído.
Este prompt cria todo o schema do banco de catálogo (db_master): empresas, funcionários, planos, funcionalidades, financeiro (assinaturas/pagamentos), logs.
Objetivo
Criar os arquivos de migration SQL em src/main/resources/migrations/master/, rodá-los automaticamente na subida da aplicação (se db_master ainda não tiver as tabelas), e criar as classes Java de acesso a dados (DAO) básicas para essas tabelas — sem endpoints HTTP ainda (isso vem no Prompt 05).
Especificação
1. Migrations (uma tabela por arquivo, numeração sequencial)
Criar em src/main/resources/migrations/master/:
001_empresas.sql002_funcionarios.sql003_api_keys.sql004_funcionalidades.sql005_empresa_funcionalidades.sql006_evolution_instancias.sql007_configuracoes_plataforma.sql008_planos.sql009_plano_funcionalidades.sql010_assinaturas.sql011_periodos_uso.sql012_pagamentos.sql013_logs_envio_avisos.sql014_lembretes_cobranca.sql015_seed_funcionalidades.sql(INSERT do catálogo — ver abaixo)
Usar exatamente o DDL do documento de arquitetura v3.0 (seção 1), tabela por tabela — não inventar colunas novas. Reproduzo aqui as tabelas que essa fase cria (copie fielmente, incluindo tipos e defaults):
empresas(id, nome, cnpj, slug, database_name, status, criado_em)funcionarios(id, empresa_id, nome, email, senha_hash, cargo, status, criado_em)api_keys(id, empresa_id, key_hash, descricao, ativa, criado_em, revogada_em)funcionalidades(id, chave, nome, descricao)empresa_funcionalidades(empresa_id, funcionalidade_id, ativa, liberado_em, liberado_por)— PK compostaevolution_instancias(id, empresa_id, instance_url, instance_token_enc, numero_whatsapp, status, solicitado_em, aprovado_em, aprovado_por)configuracoes_plataforma(chave, valor, atualizado_em)— PK = chaveplanos(id, nome, valor_mensal_centavos, descricao, ativo, criado_em)plano_funcionalidades(plano_id, funcionalidade_id)— PK compostaassinaturas(id, empresa_id, plano_id, valor_mensal_centavos, dia_vencimento, status, criado_em)periodos_uso(id, empresa_id, mes_referencia, status, data_liberacao, data_bloqueio)— UNIQUE(empresa_id, mes_referencia)pagamentos(id, empresa_id, periodo_uso_id, valor_centavos, abacatepay_charge_id, qr_code_payload, qr_code_base64, status, criado_em, pago_em)logs_envio_avisos(id, empresa_id, condominio_id, aviso_id, contato_id, contato_nome, canal, status, erro_detalhe, criado_em)lembretes_cobranca(id, empresa_id, periodo_uso_id, canal, enviado_por, criado_em)
Seed (015_seed_funcionalidades.sql): usar o catálogo completo (MVP + Fase 2) da seção 6 do documento de arquitetura v3.0 — 24 chaves MVP + 6 chaves Fase 2. Copiar os INSERT INTO funcionalidades literalmente.
2. Índices recomendados
Adicionar (na própria migration de cada tabela, ou em um 016_indices.sql):
CREATE INDEX idx_funcionarios_empresa ON funcionarios(empresa_id);
CREATE INDEX idx_api_keys_empresa ON api_keys(empresa_id);
CREATE INDEX idx_evolution_empresa ON evolution_instancias(empresa_id);
CREATE INDEX idx_assinaturas_empresa ON assinaturas(empresa_id);
CREATE INDEX idx_periodos_uso_empresa ON periodos_uso(empresa_id);
CREATE INDEX idx_pagamentos_empresa ON pagamentos(empresa_id);
CREATE INDEX idx_pagamentos_periodo ON pagamentos(periodo_uso_id);
CREATE INDEX idx_logs_envio_empresa ON logs_envio_avisos(empresa_id, status);
3. Rodar migrations na subida
No Main.java, após confirmar conexão com db_master, chamar MigrationRunner.runMigrations(masterConnection, "migrations/master").
4. DAOs básicos (sem endpoints ainda)
Criar em com.seconectai.condocontab.master.dao:
EmpresaDao(métodos:inserir,buscarPorId,listarTodas,atualizarStatus)FuncionarioDao(inserir,buscarPorEmail,listarPorEmpresa)FuncionalidadeDao(listarTodas,buscarPorChave)
Usar JDBC puro (PreparedStatement), sem ORM. Todo valor monetário como long (centavos) no Java.
Critérios de aceite
docker compose uproda as 15 migrations em ordem, sem erro, na primeira subida.- Subir o container uma segunda vez NÃO tenta re-executar migrations já aplicadas (tabela
schema_migrationsfuncionando). SELECT * FROM funcionalidadesretorna as 30 linhas do seed (24 MVP + 6 Fase 2).EmpresaDao.inserir+EmpresaDao.buscarPorIdfuncionam via um teste manual (pode ser ummaintemporário ou teste JUnit simples).- Nenhuma tabela usa
DELETEcomo estratégia de remoção — todas têm campo destatuspara inativação lógica onde fizer sentido (já está no DDL).
Ao concluir
Atualizar 10-tracker-progresso.md: Prompt 02 concluído, data, resumo. Confirmar que Prompt 01 segue marcado como concluído antes de finalizar.