Initial commit : monorepo seiche (serveur Fastify + web Vite/React, Docker, config VS Code)
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user