import { mkdirSync } from "node:fs"; import path from "node:path"; import { sql } from "drizzle-orm"; import { hashPassword } from "./auth/password"; import { loadConfig } from "./config"; import { openDatabase } from "./db/client"; import { users } from "./db/schema"; const MIGRATIONS_FOLDER = path.resolve(import.meta.dirname, "../drizzle"); /** * Crée le compte initial (admin) dans une base vide. * Idempotent : si des comptes existent déjà, rien n'est modifié. * Variables requises (voir .env.example) : SEICHE_ADMIN_USERNAME, SEICHE_ADMIN_PASSWORD. */ async function main(): Promise { const config = loadConfig(); mkdirSync(config.dataDir, { recursive: true }); const db = await openDatabase(config.dataDir, MIGRATIONS_FOLDER); const [row] = await db.select({ count: sql`count(*)` }).from(users); const existing = row?.count ?? 0; if (existing > 0) { console.log( `Base ${config.dataDir}/seiche.db : ${existing} compte(s) déjà présent(s), rien à faire.`, ); return; } const username = process.env.SEICHE_ADMIN_USERNAME; const password = process.env.SEICHE_ADMIN_PASSWORD; if (!username || !password) { throw new Error( "Base vide : définir SEICHE_ADMIN_USERNAME et SEICHE_ADMIN_PASSWORD (voir .env.example) puis relancer pnpm setup.", ); } if (password.length < 12) { throw new Error("SEICHE_ADMIN_PASSWORD doit faire au moins 12 caractères."); } const passwordHash = await hashPassword(password); await db.insert(users).values({ username, passwordHash }); console.log(`Compte initial « ${username} » créé (base : ${config.dataDir}/seiche.db).`); } main().catch((err) => { console.error( "Échec de la création du compte initial :", err instanceof Error ? err.message : err, ); process.exit(1); });