import XLSX from 'xlsx'; import { MongoClient, ObjectId } from 'mongodb'; import bcrypt from 'bcryptjs'; import path from 'path'; import { fileURLToPath } from 'url'; import dotenv from 'dotenv'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); // Charger les variables d'environnement depuis .env.local dotenv.config({ path: path.join(__dirname, '..', '.env.local') }); // Configuration const MONGODB_URI = process.env.MONGODB_URI; const XLSX_FILENAME = "IHECS.xlsx"; // ⚠️ Fichier pour IHECS / M2RP const DEFAULT_PASSWORD = "IHECS-2025"; const REFERENT = "IHECS"; const COURS = "M2RP"; async function importUsers() { console.log("🚀 Démarrage de l'import IHECS / M2RP...\n"); try { // Vérifier que MONGODB_URI est défini if (!MONGODB_URI) { throw new Error("MONGODB_URI non défini dans .env.local"); } console.log(`📋 Référent: ${REFERENT}`); console.log(`📚 Cours: ${COURS}`); console.log(`🔑 Password par défaut: ${DEFAULT_PASSWORD}\n`); // Lire le fichier Excel const filePath = path.join(__dirname, '..', 'public', 'list_users', XLSX_FILENAME); console.log(`📁 Lecture du fichier: ${filePath}`); const workbook = XLSX.readFile(filePath); const sheet = workbook.Sheets[workbook.SheetNames[0]]; const data = XLSX.utils.sheet_to_json(sheet); console.log(`✅ ${data.length} lignes détectées dans le fichier\n`); // Hash le password une seule fois (optimisation) console.log("🔐 Hash du mot de passe..."); const hashedPassword = await bcrypt.hash(DEFAULT_PASSWORD, 12); // Préparer les users const users = data.map(row => ({ nom: row["Nom de famille"], prenom: row["Prénom"], name: `${row["Prénom"]} ${row["Nom de famille"]}`, email: row["Adresse de courriel"], username: row["Nom d'utilisateur"] || row["Adresse de courriel"]?.split("@")[0], password: hashedPassword, emailVerified: false, avatar: null, provider: "local", role: "USER", // Nouveaux champs pour le cours et le référent referent: REFERENT, cours: COURS, plugins: [], twoFactorEnabled: false, termsAccepted: true, personalization: { memories: false, _id: new ObjectId(), }, backupCodes: [], refreshToken: [], createdAt: new Date(), updatedAt: new Date(), __v: 0, })); // Connexion à MongoDB console.log("🔌 Connexion à MongoDB..."); const client = new MongoClient(MONGODB_URI); await client.connect(); const db = client.db('librechat'); console.log("✅ Connecté à MongoDB\n"); // Import des users const results = { created: [], errors: [], skipped: [] }; console.log("📥 Import en cours...\n"); for (let i = 0; i < users.length; i++) { const user = users[i]; const progress = `[${i + 1}/${users.length}]`; try { // Validation email if (!user.email || !user.email.includes('@')) { console.log(`${progress} ⚠️ Email invalide: ${user.name}`); results.errors.push({ name: user.name, error: "Email invalide" }); continue; } // Vérifier si email existe déjà const existing = await db.collection("users").findOne({ email: user.email }); if (existing) { console.log(`${progress} ⏭️ Ignoré (existe déjà): ${user.email}`); results.skipped.push(user.email); continue; } // Insérer le user const result = await db.collection("users").insertOne(user); // Créer la balance initiale await db.collection("balances").insertOne({ user: result.insertedId, tokenCredits: 3000000, autoRefillEnabled: false, lastRefill: new Date(), refillAmount: 0, refillIntervalUnit: "month", refillIntervalValue: 1, __v: 0, }); console.log(`${progress} ✅ Créé: ${user.prenom} ${user.nom} (${user.email})`); results.created.push(user.email); } catch (error) { console.error(`${progress} ❌ Erreur: ${user.email} - ${error.message}`); results.errors.push({ email: user.email, error: error.message }); } } // Fermer la connexion await client.close(); // Résumé final console.log("\n" + "=".repeat(60)); console.log("📊 RÉSUMÉ DE L'IMPORT - IHECS / M2RP"); console.log("=".repeat(60)); console.log(`✅ Utilisateurs créés: ${results.created.length}`); console.log(`⏭️ Utilisateurs ignorés (déjà existants): ${results.skipped.length}`); console.log(`❌ Erreurs: ${results.errors.length}`); console.log("=".repeat(60)); if (results.errors.length > 0) { console.log("\n⚠️ DÉTAIL DES ERREURS:"); results.errors.forEach(e => { console.log(` - ${e.email || e.name}: ${e.error}`); }); } console.log("\n✨ Import terminé !\n"); } catch (error) { console.error("\n❌ ERREUR FATALE:", error.message); console.error(error); process.exit(1); } process.exit(0); } // Lancer l'import importUsers();