Files
afrov2/admin/scripts/ensure-admin.cjs

123 lines
4.4 KiB
JavaScript

const path = require('path');
const fs = require('fs');
// Si le script racine existe (monorepo), on peut le déléguer directement
const rootScript = path.resolve(__dirname, '../../scripts/ensure-admin.cjs');
if (fs.existsSync(rootScript)) {
require(rootScript);
} else {
// Sinon exécution autonome dans admin
const { PrismaClient } = require('@prisma/client');
const bcrypt = require('bcryptjs');
const prisma = new PrismaClient();
const MAX_RETRIES = parseInt(process.env.DB_WAIT_MAX_RETRIES || '90', 10);
const DELAY_MS = parseInt(process.env.DB_WAIT_DELAY_MS || '2000', 10);
async function waitForDatabase(prismaClient, maxRetries = MAX_RETRIES, delayMs = DELAY_MS) {
for (let attempt = 1; attempt <= maxRetries; attempt++) {
try {
await prismaClient.$executeRawUnsafe('SELECT 1;');
console.log('✅ Base de données prête et accessible.');
return true;
} catch (err) {
const msg = err.message || '';
const isStartingUp = msg.includes('the database system is starting up') ||
msg.includes('57P03');
const isUnreachable = msg.includes('ConnectionRefused') ||
msg.includes("Can't reach database server") ||
msg.includes('connection refused') ||
msg.includes('P1001');
let info = msg.split('\n')[0].substring(0, 80);
if (isStartingUp) {
info = 'PostgreSQL est en cours de démarrage (recovery/init)...';
} else if (isUnreachable) {
info = 'PostgreSQL pas encore joignable (démarrage du conteneur en cours)...';
}
console.log(`⏳ En attente de la base de données (${attempt}/${maxRetries}) : ${info}`);
if (attempt === maxRetries) {
throw new Error(`Délai dépassé en attendant la base de données après ${maxRetries} tentatives (${maxRetries * (delayMs / 1000)}s): ${msg}`);
}
await new Promise(resolve => setTimeout(resolve, delayMs));
}
}
}
async function main() {
const email = 'admin@afrohub.com';
const initialPassword = process.env.ADMIN_INITIAL_PASSWORD || 'afrohub2025';
console.log(`🔍 Vérification du compte Super Admin (${email})...`);
await waitForDatabase(prisma);
try {
await prisma.$executeRawUnsafe(`
ALTER TABLE "User" ADD COLUMN IF NOT EXISTS "adminRole" TEXT DEFAULT 'ADMIN';
`);
await prisma.$executeRawUnsafe(`
ALTER TABLE "User" ADD COLUMN IF NOT EXISTS "adminPermissions" TEXT[] DEFAULT ARRAY[]::TEXT[];
`);
console.log(`✅ Structure des colonnes vérifiée / mise à jour.`);
} catch (err) {
console.warn(`⚠️ Note sur la mise à jour des colonnes:`, err.message);
}
const existing = await prisma.user.findFirst({
where: { email: { equals: email, mode: 'insensitive' } }
});
if (existing) {
if (existing.adminRole !== 'SUPER_ADMIN' || existing.role !== 'ADMIN' || existing.isSuspended) {
await prisma.user.update({
where: { id: existing.id },
data: {
role: 'ADMIN',
adminRole: 'SUPER_ADMIN',
isSuspended: false
}
});
console.log(`✅ Compte existant mis à jour en SUPER_ADMIN (${email}).`);
} else {
console.log(`✅ Le compte Super Admin (${email}) est déjà présent et actif.`);
}
return;
}
const hashedPassword = await bcrypt.hash(initialPassword, 10);
const created = await prisma.user.create({
data: {
name: 'Admin Afrohub',
email: email,
password: hashedPassword,
role: 'ADMIN',
adminRole: 'SUPER_ADMIN',
adminPermissions: [],
emailVerified: true
}
});
console.log(`🎉 Compte Super Admin créé avec succès !`);
console.log(` Email: ${created.email}`);
console.log(` Rôle: ${created.adminRole}`);
console.log(` Mot de passe initial: ${process.env.ADMIN_INITIAL_PASSWORD ? '(défini via ADMIN_INITIAL_PASSWORD)' : 'afrohub2025'}`);
}
main()
.catch(err => {
console.error("⚠️ Note lors de l'initialisation du Super Admin:", err.message || err);
console.warn("⚠️ Poursuite du démarrage de l'application Next.js...");
process.exit(0);
})
.finally(async () => {
try {
await prisma.$disconnect();
} catch (_) {}
});
}