Files
Cibello-app/apps/worker/scripts/publish-translations.ts
T
Claude 5974e8740f fix(scripts): ladda .env i translate/publish-skripten (annars saknades DATABASE_URL)
De fristandiga skripten laste bara process.env och kunde inte hitta DATABASE_URL
(till skillnad fran worker/seed som laddar .env). Lade till samma dotenv-sokning
(.env / ../.env / ../../.env) sa de funkar med  utan att man
exporterar variabler manuellt. Verifierat: bada kor nu utan export och laser .env.
2026-08-20 19:27:14 +00:00

64 lines
2.2 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.
/**
* Publicera AI-receptöversättningar som klarat den inbyggda verifieringen
* (verification.ok = true). Endast PUBLICERADE översättningar visas för
* användare. Utkast som föll på verifieringen lämnas kvar för manuell
* granskning i admin (så inget felöversatt går live automatiskt).
*
* Kör EFTER att translate-recipes.ts-kön har tömts:
* pnpm --filter @app/worker exec tsx scripts/publish-translations.ts es
* pnpm --filter @app/worker exec tsx scripts/publish-translations.ts all
*
* Kräver DATABASE_URL i miljön.
*/
import { config as loadDotenv } from "dotenv";
import { existsSync } from "node:fs";
import path from "node:path";
import { and, eq, sql } from "drizzle-orm";
import { createDatabase, schema } from "@app/database";
// Ladda .env (samma sökning som worker/seed) så DATABASE_URL finns även när
// skriptet körs fristående via `pnpm exec tsx`.
for (const candidate of [".env", "../.env", "../../.env"]) {
const p = path.resolve(process.cwd(), candidate);
if (existsSync(p)) {
loadDotenv({ path: p });
break;
}
}
async function main() {
if (!process.env.DATABASE_URL) throw new Error("Sätt DATABASE_URL.");
const arg = (process.argv[2] ?? "all").toLowerCase();
const { db, pool } = createDatabase(process.env.DATABASE_URL);
const cond = [
eq(schema.recipeTranslations.status, "draft_ai"),
sql`${schema.recipeTranslations.verification}->>'ok' = 'true'`,
];
if (arg !== "all") cond.push(eq(schema.recipeTranslations.languageTag, arg));
const published = await db
.update(schema.recipeTranslations)
.set({ status: "published", updatedAt: new Date() })
.where(and(...cond))
.returning({ id: schema.recipeTranslations.id });
const [remaining] = await db
.select({ n: sql<number>`count(*)::int` })
.from(schema.recipeTranslations)
.where(eq(schema.recipeTranslations.status, "draft_ai"));
console.log(`Publicerade ${published.length} verifierade översättningar (${arg}).`);
console.log(
`Kvar som utkast (föll på verifieringen granska i admin vid behov): ${remaining?.n ?? 0}.`,
);
await pool.end();
}
main().then(
() => process.exit(0),
(e) => {
console.error(e);
process.exit(1);
},
);