fix(db): desacopla configuracao administrativa das migrations
ci / lint, typecheck, testes e build (push) Canceled after 0s
ci / Postgres e Redis reais (push) Canceled after 0s
ci / imagem Docker Linux (push) Canceled after 0s

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
camilafagundesandCursor committed 2026-10-24 01:14:00 -03:00
1 parent 93f280621b
commit 8cfeeb0464
7 files changed
+356 -29

No files matched your search

+47 -22
View File
@@ -1,28 +1,53 @@
import { identityShimEnabled } from "../src/config/env";
import { migrate, pendingMigrations } from "../src/infra/db/migrate";
import { bootstrapScript, describeTarget, runWithDb } from "./_bootstrap";
import { adapterEnv, identityShimEnabled } from "../src/config/env";
import { exitOnInvalidMigrationConfig } from "../src/config/fail-fast";
import {
assertManifestMatches,
listMigrationFiles,
migrate,
pendingMigrations,
readMigrationLedger,
} from "../src/infra/db/migrate";
import { bootstrapScript, describeTarget, runScript, runWithDb } from "./_bootstrap";
/**
* Aplica as migrations pendentes. `--dry-run` apenas lista: usado no pipeline
* antes do passo manual de migração, para que ninguém descubra o que vai rodar
* só depois de ter rodado.
* Três modos, separados de propósito:
* - `--plan` lista o manifesto no disco e não abre banco.
* - `--dry-run` lê `schema_migrations` e não aplica SQL.
* - sem flag, aplica o lote pendente numa transação.
*/
const plan = process.argv.includes("--plan");
const dryRun = process.argv.includes("--dry-run");
bootstrapScript("migrate");
if (plan) {
runScript("migrate", async () => {
const files = await listMigrationFiles();
assertManifestMatches(files);
console.log(`plano estatico offline: ${files.join(", ")}`);
});
} else {
if (adapterEnv() === "staging") exitOnInvalidMigrationConfig(process.env);
else if (adapterEnv() === "production") {
console.error(
"[adaptador-planilhas] Configuração administrativa recusada. ADAPTER_ENV: migrate administrativo de homologação exige staging",
);
process.exit(1);
} else bootstrapScript("migrate");
runWithDb("migrate", "admin", async (db) => {
const pending = await pendingMigrations(db);
console.log(`alvo: ${describeTarget()}`);
console.log(`shim de identidade: ${identityShimEnabled() ? "SERÁ aplicado" : "NÃO será aplicado"}`);
if (pending.length === 0) {
console.log("migrations: nada pendente");
return;
}
if (dryRun) {
console.log(`migrations pendentes (dry-run, nada aplicado): ${pending.join(", ")}`);
return;
}
const ran = await migrate(db);
console.log(ran.length ? `migrations aplicadas: ${ran.join(", ")}` : "migrations: nada pendente");
});
runWithDb("migrate", "admin", async (db) => {
const ledger = await readMigrationLedger(db);
const pending = await pendingMigrations(db);
console.log(`alvo: ${adapterEnv() === "staging" ? "postgres administrativo" : describeTarget()}`);
console.log(`shim de identidade: ${identityShimEnabled() ? "SERÁ aplicado" : "NÃO será aplicado"}`);
if (ledger.state === "ausente") console.log("historico: ausente; schema_migrations nao foi criada");
if (pending.length === 0) {
console.log("migrations: nada pendente");
return;
}
if (dryRun) {
console.log(`migrations pendentes (dry-run, nada aplicado): ${pending.join(", ")}`);
return;
}
const ran = await migrate(db);
console.log(ran.length ? `migrations aplicadas: ${ran.join(", ")}` : "migrations: nada pendente");
});
}