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