SONUM v7 - Évolution v6 (éditeurs/blocs CRUD, tableau de bord stats) + vue liste alternance couleurs

This commit is contained in:
Manus Agent
2026-04-20 11:51:04 -04:00
commit 3bccb0a743
143 changed files with 30933 additions and 0 deletions

93
scripts/create-admin.mjs Normal file
View File

@@ -0,0 +1,93 @@
import { drizzle } from "drizzle-orm/mysql2";
import mysql from "mysql2/promise";
import bcrypt from "bcryptjs";
import { eq } from "drizzle-orm";
import * as schema from "../drizzle/schema.ts";
import dotenv from "dotenv";
dotenv.config();
const { users, localCredentials } = schema;
const EMAIL = "adminItinova"; // login (utilisé comme email)
const PASSWORD = "Itinova69!";
const NAME = "Gestionnaire SONUM (Itinova)";
const SONUM_ROLE = "gestionnaire";
const OPEN_ID = "local-admin-itinova"; // openId unique pour compte local
async function main() {
if (!process.env.DATABASE_URL) {
console.error("DATABASE_URL manquant");
process.exit(1);
}
const connection = await mysql.createConnection(process.env.DATABASE_URL);
const db = drizzle(connection);
// Vérifier si l'utilisateur existe déjà
const existing = await db
.select()
.from(users)
.where(eq(users.openId, OPEN_ID))
.limit(1);
let userId;
if (existing.length > 0) {
userId = existing[0].id;
console.log(`Utilisateur existant trouvé (id=${userId}), mise à jour du mot de passe...`);
// Mettre à jour le rôle au cas où
await db
.update(users)
.set({ sonumRole: SONUM_ROLE, name: NAME, email: EMAIL, updatedAt: new Date() })
.where(eq(users.id, userId));
} else {
// Créer l'utilisateur
const result = await db.insert(users).values({
openId: OPEN_ID,
name: NAME,
email: EMAIL,
loginMethod: "local",
role: "user",
sonumRole: SONUM_ROLE,
cguAccepted: true,
cguAcceptedAt: new Date(),
lastSignedIn: new Date(),
});
userId = Number(result[0].insertId);
console.log(`Utilisateur créé (id=${userId})`);
}
// Hasher le mot de passe
const passwordHash = await bcrypt.hash(PASSWORD, 12);
// Insérer ou mettre à jour les credentials locaux
const existingCreds = await db
.select()
.from(localCredentials)
.where(eq(localCredentials.userId, userId))
.limit(1);
if (existingCreds.length > 0) {
await db
.update(localCredentials)
.set({ passwordHash, updatedAt: new Date() })
.where(eq(localCredentials.userId, userId));
console.log("Mot de passe mis à jour.");
} else {
await db.insert(localCredentials).values({ userId, passwordHash });
console.log("Credentials locaux créés.");
}
console.log("\n✅ Compte générique gestionnaire SONUM prêt :");
console.log(` Login : ${EMAIL}`);
console.log(` Rôle : ${SONUM_ROLE}`);
console.log(` Nom : ${NAME}`);
await connection.end();
}
main().catch((err) => {
console.error("Erreur :", err);
process.exit(1);
});