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:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user