96 lines
3.4 KiB
TypeScript
96 lines
3.4 KiB
TypeScript
import { PrismaClient } from "@prisma/client";
|
||
import { defaultCategories, defaultRootFolder } from "../lib/defaults";
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
async function main() {
|
||
console.log("🌱 Seeding database...");
|
||
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// Créer le dossier racine
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
const rootFolder = await prisma.folder.upsert({
|
||
where: { id: defaultRootFolder.id },
|
||
update: {},
|
||
create: defaultRootFolder,
|
||
});
|
||
console.log("📁 Root folder:", rootFolder.name);
|
||
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
// Créer les catégories (hiérarchiques)
|
||
// ═══════════════════════════════════════════════════════════════════════════
|
||
const slugToId = new Map<string, string>();
|
||
|
||
// D'abord les parents
|
||
const parents = defaultCategories.filter((c) => c.parentSlug === null);
|
||
console.log(`\n🏷️ Création de ${parents.length} catégories parentes...`);
|
||
|
||
for (const category of parents) {
|
||
const existing = await prisma.category.findFirst({
|
||
where: { name: category.name, parentId: null },
|
||
});
|
||
|
||
if (!existing) {
|
||
const created = await prisma.category.create({
|
||
data: {
|
||
name: category.name,
|
||
color: category.color,
|
||
icon: category.icon,
|
||
keywords: JSON.stringify(category.keywords),
|
||
parentId: null,
|
||
},
|
||
});
|
||
slugToId.set(category.slug, created.id);
|
||
console.log(` ✅ ${category.name}`);
|
||
} else {
|
||
slugToId.set(category.slug, existing.id);
|
||
}
|
||
}
|
||
|
||
// Puis les enfants
|
||
const children = defaultCategories.filter((c) => c.parentSlug !== null);
|
||
console.log(`\n📂 Création de ${children.length} sous-catégories...`);
|
||
|
||
for (const category of children) {
|
||
const parentId = slugToId.get(category.parentSlug!);
|
||
|
||
if (!parentId) {
|
||
console.log(` ⚠️ Parent non trouvé pour: ${category.name}`);
|
||
continue;
|
||
}
|
||
|
||
const existing = await prisma.category.findFirst({
|
||
where: { name: category.name, parentId },
|
||
});
|
||
|
||
if (!existing) {
|
||
const created = await prisma.category.create({
|
||
data: {
|
||
name: category.name,
|
||
color: category.color,
|
||
icon: category.icon,
|
||
keywords: JSON.stringify(category.keywords),
|
||
parentId,
|
||
},
|
||
});
|
||
slugToId.set(category.slug, created.id);
|
||
console.log(` ✅ ${category.name}`);
|
||
} else {
|
||
slugToId.set(category.slug, existing.id);
|
||
}
|
||
}
|
||
|
||
// Stats
|
||
const totalCategories = await prisma.category.count();
|
||
console.log(`\n✨ Seeding terminé! ${totalCategories} catégories en base.`);
|
||
}
|
||
|
||
main()
|
||
.catch((e) => {
|
||
console.error(e);
|
||
process.exit(1);
|
||
})
|
||
.finally(async () => {
|
||
await prisma.$disconnect();
|
||
});
|