From 905e2b2081a138b15c41d3c55148ecc2ecb34b4f Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Fri, 22 Aug 2025 16:41:41 +0200 Subject: [PATCH] refactor: improve logging and streamline skill synchronization process - Enhanced console logging for better clarity during skill category processing. - Simplified skill update checks and utilized bulkInsertSkillsFromJSON for efficient skill management. - Improved code readability by standardizing formatting and reducing unnecessary comments. --- scripts/sync-skills.ts | 109 +++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 49 deletions(-) diff --git a/scripts/sync-skills.ts b/scripts/sync-skills.ts index 07c8dd4..ea6c14b 100644 --- a/scripts/sync-skills.ts +++ b/scripts/sync-skills.ts @@ -24,16 +24,20 @@ async function syncSkillsToDatabase(): Promise { // Charger les skills depuis les fichiers JSON const skillCategoriesFromFiles = loadSkillCategoriesFromFiles(); - console.log(`📁 ${skillCategoriesFromFiles.length} catégories trouvées dans les fichiers`); + console.log( + `📁 ${skillCategoriesFromFiles.length} catégories trouvées dans les fichiers` + ); // Récupérer les skills existantes de la base de données const existingCategories = await SkillsService.getSkillCategories(); - console.log(`💾 ${existingCategories.length} catégories existantes en base`); + console.log( + `💾 ${existingCategories.length} catégories existantes en base` + ); // Créer un map des skills existantes pour une recherche rapide const existingSkillsMap = new Map(); - existingCategories.forEach(category => { - category.skills.forEach(skill => { + existingCategories.forEach((category) => { + category.skills.forEach((skill) => { existingSkillsMap.set(skill.id, skill); }); }); @@ -45,70 +49,75 @@ async function syncSkillsToDatabase(): Promise { skillsProcessed: 0, newSkills: 0, updatedSkills: 0, - skippedSkills: 0 + skippedSkills: 0, }; // Synchroniser chaque catégorie for (const categoryFromFile of skillCategoriesFromFiles) { - console.log(`\n📂 Traitement de la catégorie: ${categoryFromFile.category}`); - + console.log( + `\n📂 Traitement de la catégorie: ${categoryFromFile.category}` + ); + const categoryId = categoryFromFile.category.toLowerCase(); - + // Vérifier si la catégorie existe, sinon la créer - const existingCategory = existingCategories.find(cat => - cat.category.toLowerCase() === categoryFromFile.category.toLowerCase() + const existingCategory = existingCategories.find( + (cat) => + cat.category.toLowerCase() === categoryFromFile.category.toLowerCase() ); if (!existingCategory) { - console.log(` ➕ Création de la nouvelle catégorie: ${categoryFromFile.category}`); + console.log( + ` ➕ Création de la nouvelle catégorie: ${categoryFromFile.category}` + ); await SkillsService.createSkillCategory({ id: categoryId, name: categoryFromFile.category, - icon: categoryFromFile.icon + icon: categoryFromFile.icon, }); } // Synchroniser les skills de cette catégorie for (const skillFromFile of categoryFromFile.skills) { const existingSkill = existingSkillsMap.get(skillFromFile.id); - - if (!existingSkill) { - // Nouvelle skill - l'ajouter - console.log(` ➕ Nouvelle skill: ${skillFromFile.name} (${skillFromFile.id})`); - await SkillsService.createSkill({ - id: skillFromFile.id, - name: skillFromFile.name, - description: skillFromFile.description, - icon: skillFromFile.icon, - categoryId: categoryId, - links: skillFromFile.links || [] - }); - stats.newSkills++; - } else { - // Skill existante - vérifier s'il faut mettre à jour description/icon/links - const needsUpdate = - existingSkill.description !== skillFromFile.description || - existingSkill.icon !== skillFromFile.icon || - JSON.stringify(existingSkill.links?.sort()) !== JSON.stringify(skillFromFile.links?.sort()); - if (needsUpdate) { - console.log(` 🔄 Mise à jour de la skill: ${skillFromFile.name} (${skillFromFile.id})`); - // Utiliser la méthode bulkInsert avec une seule catégorie/skill pour la mise à jour - await SkillsService.bulkInsertSkillsFromJSON([{ - category: categoryFromFile.category, - icon: categoryFromFile.icon, - skills: [skillFromFile] - }]); - stats.updatedSkills++; - } else { - console.log(` ✅ Skill inchangée: ${skillFromFile.name} (${skillFromFile.id})`); - stats.skippedSkills++; - } + // Utiliser bulkInsertSkillsFromJSON qui gère les conflits automatiquement + const needsUpdate = existingSkill + ? existingSkill.description !== skillFromFile.description || + existingSkill.icon !== skillFromFile.icon || + JSON.stringify(existingSkill.links?.sort()) !== + JSON.stringify(skillFromFile.links?.sort()) + : true; + + if (!existingSkill) { + console.log( + ` ➕ Nouvelle skill: ${skillFromFile.name} (${skillFromFile.id})` + ); + stats.newSkills++; + } else if (needsUpdate) { + console.log( + ` 🔄 Mise à jour de la skill: ${skillFromFile.name} (${skillFromFile.id})` + ); + stats.updatedSkills++; + } else { + console.log( + ` ✅ Skill inchangée: ${skillFromFile.name} (${skillFromFile.id})` + ); + stats.skippedSkills++; } - + + // Insérer/mettre à jour la skill (bulkInsert gère les conflits) + await SkillsService.bulkInsertSkillsFromJSON([ + { + category: categoryFromFile.category, + icon: categoryFromFile.icon, + skills: [skillFromFile], + }, + ]); + stats.skillsProcessed++; } - + stats.categoriesProcessed++; } @@ -122,11 +131,13 @@ async function syncSkillsToDatabase(): Promise { // Vérification finale const finalCategories = await SkillsService.getSkillCategories(); - const totalSkillsInDb = finalCategories.reduce((sum, cat) => sum + cat.skills.length, 0); - + const totalSkillsInDb = finalCategories.reduce( + (sum, cat) => sum + cat.skills.length, + 0 + ); + console.log(`\n✅ Synchronisation terminée avec succès!`); console.log(`💾 Total skills en base: ${totalSkillsInDb}`); - } catch (error) { console.error("❌ Erreur lors de la synchronisation:", error); process.exit(1);