168 lines
5.1 KiB
JavaScript
168 lines
5.1 KiB
JavaScript
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();
|