fix(user): persist updateUser correctly; add setup:api script and README update; seeders tweaks
This commit is contained in:
@@ -0,0 +1,154 @@
|
||||
#!/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();
|
||||
Reference in New Issue
Block a user