53 lines
1.8 KiB
TypeScript
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);
|
|
});
|