Files
seiche/server/src/setup.ts
T

53 lines
1.8 KiB
TypeScript

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<void> {
const config = loadConfig();
mkdirSync(config.dataDir, { recursive: true });
const db = await openDatabase(config.dataDir, MIGRATIONS_FOLDER);
const [row] = await db.select({ count: sql<number>`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);
});