feat: enhance skill and user data generation

- Updated loadAllSkills to return both skills and categories, improving data structure.
- Added insertSkillCategories and insertSkills functions for database insertion of skills and categories.
- Modified insertTestUsers to include email and password hash, enhancing user data integrity.
- Improved logging for better visibility during data generation process.
This commit is contained in:
Julien Froidefond
2025-08-25 22:11:17 +02:00
parent d58ee314f7
commit 2318656a7e

View File

@@ -76,27 +76,51 @@ interface SkillData {
category: string; category: string;
} }
async function loadAllSkills(): Promise<SkillData[]> { interface SkillCategoryData {
id: string;
name: string;
icon: string;
}
async function loadAllSkills(): Promise<{
skills: SkillData[];
categories: SkillCategoryData[];
}> {
const skillsDir = path.join(__dirname, "../data/skills"); const skillsDir = path.join(__dirname, "../data/skills");
const files = fs const files = fs
.readdirSync(skillsDir) .readdirSync(skillsDir)
.filter((file) => file.endsWith(".json")); .filter((file) => file.endsWith(".json"));
const allSkills: SkillData[] = []; const allSkills: SkillData[] = [];
const categoriesMap = new Map<string, SkillCategoryData>();
for (const file of files) { for (const file of files) {
const filePath = path.join(skillsDir, file); const filePath = path.join(skillsDir, file);
const content = JSON.parse(fs.readFileSync(filePath, "utf-8")); const content = JSON.parse(fs.readFileSync(filePath, "utf-8"));
// Extraire la catégorie
const categoryId = content.category.toLowerCase().replace(/\s+/g, "-");
const categoryName = content.category;
const categoryIcon = content.icon || "default-icon";
categoriesMap.set(categoryId, {
id: categoryId,
name: categoryName,
icon: categoryIcon,
});
content.skills.forEach((skill: any) => { content.skills.forEach((skill: any) => {
allSkills.push({ allSkills.push({
...skill, ...skill,
category: content.category, category: categoryId,
}); });
}); });
} }
return allSkills; return {
skills: allSkills,
categories: Array.from(categoriesMap.values()),
};
} }
function getRandomElement<T>(array: T[]): T { function getRandomElement<T>(array: T[]): T {
@@ -123,6 +147,40 @@ function generateRandomLevel(): SkillLevel {
return "never"; return "never";
} }
async function insertSkillCategories(categories: SkillCategoryData[]) {
const pool = getPool();
console.log("📚 Création des catégories de skills...");
for (const category of categories) {
await pool.query(
"INSERT INTO skill_categories (id, name, icon) VALUES ($1, $2, $3) ON CONFLICT (id) DO NOTHING",
[category.id, category.name, category.icon]
);
console.log(` ✅ Catégorie créée: ${category.name}`);
}
}
async function insertSkills(skills: SkillData[]) {
const pool = getPool();
console.log("🔧 Création des skills...");
for (const skill of skills) {
await pool.query(
"INSERT INTO skills (id, name, description, icon, category_id) VALUES ($1, $2, $3, $4, $5) ON CONFLICT (id) DO NOTHING",
[
skill.id,
skill.name,
skill.description,
skill.icon || null,
skill.category,
]
);
}
console.log(`${skills.length} skills créés`);
}
async function insertTestTeams() { async function insertTestTeams() {
const pool = getPool(); const pool = getPool();
@@ -151,14 +209,16 @@ async function insertTestUsers() {
for (let i = 0; i < userCount; i++) { for (let i = 0; i < userCount; i++) {
const firstName = getRandomElement(FIRST_NAMES); const firstName = getRandomElement(FIRST_NAMES);
const lastName = getRandomElement(LAST_NAMES); const lastName = getRandomElement(LAST_NAMES);
const email = `${firstName.toLowerCase()}.${lastName.toLowerCase()}@peakskills.local`;
const passwordHash = "$2b$10$default.hash.for.test.users.placeholder";
try { try {
const result = await pool.query( const result = await pool.query(
`INSERT INTO users (first_name, last_name, team_id) `INSERT INTO users (first_name, last_name, team_id, email, password_hash)
VALUES ($1, $2, $3) VALUES ($1, $2, $3, $4, $5)
ON CONFLICT (first_name, last_name, team_id) DO NOTHING ON CONFLICT (email) DO NOTHING
RETURNING uuid_id`, RETURNING uuid_id`,
[firstName, lastName, team.id] [firstName, lastName, team.id, email, passwordHash]
); );
if (result.rows.length > 0) { if (result.rows.length > 0) {
@@ -167,13 +227,14 @@ async function insertTestUsers() {
firstName, firstName,
lastName, lastName,
teamId: team.id, teamId: team.id,
email,
}); });
console.log( console.log(
` ✅ Utilisateur créé: ${firstName} ${lastName} (${team.name})` ` ✅ Utilisateur créé: ${firstName} ${lastName} (${team.name}) - ${email}`
); );
} }
} catch (error) { } catch (error) {
// Ignore les conflits de nom // Ignore les conflits d'email
console.log( console.log(
` ⚠️ Utilisateur ${firstName} ${lastName} existe déjà dans ${team.name}` ` ⚠️ Utilisateur ${firstName} ${lastName} existe déjà dans ${team.name}`
); );
@@ -234,10 +295,20 @@ async function main() {
try { try {
console.log("🚀 Génération des données de test...\n"); console.log("🚀 Génération des données de test...\n");
// Charger tous les skills // Charger tous les skills et catégories
console.log("📚 Chargement des skills..."); console.log("📚 Chargement des skills et catégories...");
const skills = await loadAllSkills(); const { skills, categories } = await loadAllSkills();
console.log(`${skills.length} skills chargées\n`); console.log(
`${skills.length} skills chargées dans ${categories.length} catégories\n`
);
// Créer les catégories de skills
await insertSkillCategories(categories);
console.log("");
// Créer les skills
await insertSkills(skills);
console.log("");
// Créer les teams // Créer les teams
await insertTestTeams(); await insertTestTeams();
@@ -254,9 +325,10 @@ async function main() {
console.log("✨ Données de test générées avec succès !"); console.log("✨ Données de test générées avec succès !");
console.log(`📈 Résumé :`); console.log(`📈 Résumé :`);
console.log(` - Direction: ${TEST_DIRECTION}`); console.log(` - Direction: ${TEST_DIRECTION}`);
console.log(` - Catégories de skills: ${categories.length}`);
console.log(` - Skills: ${skills.length}`);
console.log(` - Teams: ${TEST_TEAMS.length}`); console.log(` - Teams: ${TEST_TEAMS.length}`);
console.log(` - Utilisateurs: ${users.length}`); console.log(` - Utilisateurs: ${users.length}`);
console.log(` - Skills disponibles: ${skills.length}`);
} catch (error) { } catch (error) {
console.error("❌ Erreur lors de la génération des données:", error); console.error("❌ Erreur lors de la génération des données:", error);
process.exit(1); process.exit(1);