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;
}
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 files = fs
.readdirSync(skillsDir)
.filter((file) => file.endsWith(".json"));
const allSkills: SkillData[] = [];
const categoriesMap = new Map<string, SkillCategoryData>();
for (const file of files) {
const filePath = path.join(skillsDir, file);
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) => {
allSkills.push({
...skill,
category: content.category,
category: categoryId,
});
});
}
return allSkills;
return {
skills: allSkills,
categories: Array.from(categoriesMap.values()),
};
}
function getRandomElement<T>(array: T[]): T {
@@ -123,6 +147,40 @@ function generateRandomLevel(): SkillLevel {
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() {
const pool = getPool();
@@ -151,14 +209,16 @@ async function insertTestUsers() {
for (let i = 0; i < userCount; i++) {
const firstName = getRandomElement(FIRST_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 {
const result = await pool.query(
`INSERT INTO users (first_name, last_name, team_id)
VALUES ($1, $2, $3)
ON CONFLICT (first_name, last_name, team_id) DO NOTHING
`INSERT INTO users (first_name, last_name, team_id, email, password_hash)
VALUES ($1, $2, $3, $4, $5)
ON CONFLICT (email) DO NOTHING
RETURNING uuid_id`,
[firstName, lastName, team.id]
[firstName, lastName, team.id, email, passwordHash]
);
if (result.rows.length > 0) {
@@ -167,13 +227,14 @@ async function insertTestUsers() {
firstName,
lastName,
teamId: team.id,
email,
});
console.log(
` ✅ Utilisateur créé: ${firstName} ${lastName} (${team.name})`
` ✅ Utilisateur créé: ${firstName} ${lastName} (${team.name}) - ${email}`
);
}
} catch (error) {
// Ignore les conflits de nom
// Ignore les conflits d'email
console.log(
` ⚠️ Utilisateur ${firstName} ${lastName} existe déjà dans ${team.name}`
);
@@ -234,10 +295,20 @@ async function main() {
try {
console.log("🚀 Génération des données de test...\n");
// Charger tous les skills
console.log("📚 Chargement des skills...");
const skills = await loadAllSkills();
console.log(`${skills.length} skills chargées\n`);
// Charger tous les skills et catégories
console.log("📚 Chargement des skills et catégories...");
const { skills, categories } = await loadAllSkills();
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
await insertTestTeams();
@@ -254,9 +325,10 @@ async function main() {
console.log("✨ Données de test générées avec succès !");
console.log(`📈 Résumé :`);
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(` - Utilisateurs: ${users.length}`);
console.log(` - Skills disponibles: ${skills.length}`);
} catch (error) {
console.error("❌ Erreur lors de la génération des données:", error);
process.exit(1);