#!/usr/bin/env node /** * Script pour créer un utilisateur Admin interactivement * Usage: npm run create:user */ const readline = require('readline'); const crypto = require('crypto'); const { v4: uuidv4 } = require('uuid'); // Load environment const appEnv = process.env.APP_ENV || 'development'; require('dotenv').config({ path: `.env.${appEnv}` }); const sequelize = require('../src/database/config/sequelize'); // Create readline interface const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // Helper function for prompts const question = (prompt) => { return new Promise((resolve) => { rl.question(prompt, (answer) => { resolve(answer); }); }); }; // Hash password const hashPassword = (password) => { const salt = crypto.randomBytes(16).toString('hex'); const hash = crypto.pbkdf2Sync(password, salt, 10000, 512, 'sha512').toString('hex'); return { salt, hash }; }; // Main function const createUser = async () => { try { console.log('\n🔐 Création d\'un utilisateur Admin\n'); console.log('Veuillez fournir les informations suivantes:\n'); // Get user input const email = await question('Email: '); const username = await question('Nom d\'utilisateur: '); const firstname = await question('Prénom (optionnel): '); const lastname = await question('Nom (optionnel): '); const phone = await question('Téléphone (optionnel): '); const password = await question('Mot de passe: '); const passwordConfirm = await question('Confirmer le mot de passe: '); // Validation if (!email || !username || !password) { console.error('\n❌ Email, nom d\'utilisateur et mot de passe sont obligatoires\n'); rl.close(); process.exit(1); } if (password !== passwordConfirm) { console.error('\n❌ Les mots de passe ne correspondent pas\n'); rl.close(); process.exit(1); } if (password.length < 6) { console.error('\n❌ Le mot de passe doit contenir au moins 6 caractères\n'); rl.close(); process.exit(1); } // Connect to database and load models console.log('\n📡 Connexion à la base de données...'); await sequelize.authenticate(); console.log('✅ Connexion établie\n'); // Initialize all models by calling their functions const rawDB = require('../src/database/models/mysql'); // Call each model function to initialize it rawDB.User(); rawDB.Role(); rawDB.Article(); rawDB.Tag(); rawDB.TagList(); rawDB.UserRoleXref(); rawDB.Follower(); rawDB.Favorite(); rawDB.Comment(); rawDB.Brand(); rawDB.Category(); rawDB.Packaging(); rawDB.Product(); rawDB.ProductCategoryXref(); rawDB.ProductTagXref(); // Also initialize relationships require('../src/database/relationships')(); // Get the initialized models from sequelize const DB = sequelize.models; // Hash password with same algorithm as UserService const { salt, hash } = hashPassword(password); // Create user console.log('👤 Création de l\'utilisateur...'); const user = await DB.User.create({ id: uuidv4(), email: email.toLowerCase(), username, firstname: firstname || null, lastname: lastname || null, phone: phone || null, image: null, role: 'Admin', salt, hash }); // Find and assign Admin role const adminRole = await DB.Role.findOne({ where: { name: 'Admin' } }); if (adminRole) { await user.addRoleIdRole(adminRole); console.log('✅ Rôle Admin assigné\n'); } else { console.log('⚠️ Rôle Admin non trouvé, création en tant qu\'utilisateur uniquement\n'); } // Success message console.log('✅ Utilisateur créé avec succès!\n'); console.log('Détails:'); console.log(` 📧 Email: ${user.email}`); console.log(` 👤 Nom d'utilisateur: ${user.username}`); console.log(` 🔐 Rôle: ${user.role}`); console.log(''); rl.close(); await sequelize.close(); process.exit(0); } catch (error) { console.error('\n❌ Erreur lors de la création de l\'utilisateur:\n'); console.error(error.message); console.error(error.stack); console.log(''); rl.close(); process.exit(1); } }; // Run script createUser();