Files
Cibello-app/packages/database/src/migrate.ts
T

74 lines
2.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { config as loadDotenv } from "dotenv";
import { existsSync } from "node:fs";
import path from "node:path";
// Ladda .env från paketet ELLER monorepo-roten (pnpm --filter sätter cwd till paketet).
for (const candidate of [".env", "../.env", "../../.env"]) {
const p = path.resolve(process.cwd(), candidate);
if (existsSync(p)) {
loadDotenv({ path: p });
break;
}
}
import { fileURLToPath } from "node:url";
import { migrate } from "drizzle-orm/node-postgres/migrator";
import { createDatabase } from "./client.js";
/**
* Kör alla väntande SQL-migrationer från infrastructure/migrations.
* Används i dev, CI och deploy (spec §63: migration + rollback + kontroll).
*
* `--test` eller `MIGRATE_TARGET=test` migrerar TEST_DATABASE_URL.
* Utan flagga används ENDAST DATABASE_URL deploy kan aldrig röra testdatabasen.
*/
const isTestTarget = process.argv.includes("--test") || process.env.MIGRATE_TARGET === "test";
const connectionString = isTestTarget ? process.env.TEST_DATABASE_URL : process.env.DATABASE_URL;
if (!connectionString) {
if (isTestTarget) {
throw new Error("Sätt TEST_DATABASE_URL för test-migrationer.");
}
throw new Error("Sätt DATABASE_URL innan migration körs.");
}
const migrationsFolder = path.resolve(
path.dirname(fileURLToPath(import.meta.url)),
"../../../infrastructure/migrations",
);
async function main() {
const { db, pool } = createDatabase(connectionString);
console.log(`[migrate] Kör migrationer från ${migrationsFolder}`);
await migrate(db, { migrationsFolder });
// i18n M7: accentokänslig + fuzzy sök. Extensions kräver rättigheter
// i produktion skapas de av create-database.sql (master); här är de idempotenta
// och hoppas över med varning om rättighet saknas.
try {
await pool.query("CREATE EXTENSION IF NOT EXISTS unaccent");
await pool.query("CREATE EXTENSION IF NOT EXISTS pg_trgm");
await pool.query(
"CREATE INDEX IF NOT EXISTS canonical_ingredients_name_trgm_idx ON canonical_ingredients USING gin (name_sv gin_trgm_ops)",
);
await pool.query(
"CREATE INDEX IF NOT EXISTS ingredient_translations_name_trgm_idx ON ingredient_translations USING gin (name gin_trgm_ops)",
);
await pool.query(
"CREATE INDEX IF NOT EXISTS recipes_title_trgm_idx ON recipes USING gin (title_sv gin_trgm_ops)",
);
console.log("[migrate] Sök-extensions + trigramindex på plats (i18n M7).");
} catch (err) {
console.warn(
"[migrate] VARNING: kunde inte skapa sök-extensions/index (kör create-database.sql som master först):",
(err as Error).message,
);
}
console.log("[migrate] Klart.");
await pool.end();
}
main().catch((err) => {
console.error("[migrate] MISSLYCKADES:", err);
process.exit(1);
});