kreativortex/prisma/seed.ts
Jessica Rekcah 4253483f44 jalan
2025-12-02 00:22:34 +07:00

189 lines
4.8 KiB
TypeScript

import { prisma } from '../lib/prisma';
import { auth } from '../lib/auth';
async function main() {
console.log('Start seeding...');
// 1. Create Roles
const adminRole = await prisma.userRole.upsert({
where: { name: 'ADMIN' },
update: {},
create: {
name: 'ADMIN',
description: 'Administrator with full access',
permissions: ['*'],
},
});
await prisma.userRole.upsert({
where: { name: 'PENDIDIK' },
update: {},
create: {
name: 'PENDIDIK',
description: 'Educator who can create classes and content',
permissions: ['class:create', 'class:manage', 'content:create', 'assignment:create', 'forum:moderate'],
},
});
await prisma.userRole.upsert({
where: { name: 'CALON_PENDIDIK' },
update: {},
create: {
name: 'CALON_PENDIDIK',
description: 'Prospective educator/student',
permissions: ['class:join', 'content:view', 'assignment:submit', 'forum:participate'],
},
});
await prisma.userRole.upsert({
where: { name: 'UMUM' },
update: {},
create: {
name: 'UMUM',
description: 'General user with basic access',
permissions: ['content:view', 'forum:general'],
},
});
console.log('Roles created/verified.');
// 2. Create Admin User
const adminEmail = 'admin@kreativortex.com';
const adminPassword = 'adminpassword123'; // Change this in production!
let adminUserId: string;
const existingUser = await prisma.user.findUnique({
where: { email: adminEmail },
});
if (existingUser) {
adminUserId = existingUser.id;
} else {
console.log('Creating admin user...');
const res = await auth.api.signUpEmail({
body: {
email: adminEmail,
password: adminPassword,
name: 'Admin KreatiVortex',
image: 'https://ui-avatars.com/api/?name=Admin+KV&background=ffd700&color=000',
},
});
adminUserId = res.user.id;
}
// 4. Create Admin Profile
await prisma.userProfile.upsert({
where: { userId: adminUserId },
update: {
roleId: adminRole.id,
},
create: {
userId: adminUserId,
roleId: adminRole.id,
bio: 'Administrator of KreatiVortex Platform',
},
});
console.log(`Admin user created with email: ${adminEmail}`);
// 5. Seed Menus
const menus = [
{
name: { id: 'Teori', en: 'Theory' },
description: { id: 'Menu pembelajaran teori tari', en: 'Dance theory learning menu' },
children: [
'Pengetahuan dasar tari',
'Unsur utama gerak',
'Unsur utama pertunjukan tari',
'Penciptaan tari dan pengambangan diri',
],
},
{
name: { id: 'Praktik', en: 'Practice' },
description: { id: 'Menu pembelajaran praktik tari', en: 'Dance practice learning menu' },
children: ['Olah Tubuh', 'Imitasi Gerak', 'Gerak Dasar'],
},
{
name: { id: 'Template Makalah', en: 'Paper Template' },
description: { id: 'Template penyusunan makalah', en: 'Paper composition template' },
children: [],
},
{
name: { id: 'Tempo', en: 'Tempo' },
description: { id: 'Latihan tempo gerak', en: 'Movement tempo practice' },
children: [],
},
];
// Helper to create slugs
const slugify = (text: string) =>
text
.toLowerCase()
.replace(/ /g, '-')
.replace(/[^\w-]+/g, '');
for (const menuData of menus) {
const menuSlug = slugify(menuData.name.id);
// Check if parent menu exists
let parentMenu = await prisma.menu.findFirst({
where: {
slug: menuSlug,
parentId: null,
},
});
if (!parentMenu) {
console.log(`Creating menu: ${menuData.name.id} (${menuSlug})`);
parentMenu = await prisma.menu.create({
data: {
name: menuData.name,
slug: menuSlug,
description: menuData.description,
updatedBy: adminUserId,
},
});
} else {
console.log(`Menu already exists: ${menuData.name.id}`);
}
// Create children
for (const childName of menuData.children) {
const childNameJson = { id: childName, en: childName };
const childSlug = slugify(childName);
const childMenu = await prisma.menu.findFirst({
where: {
slug: childSlug,
parentId: parentMenu.id,
},
});
if (!childMenu) {
console.log(`Creating sub-menu: ${childName} (${childSlug})`);
await prisma.menu.create({
data: {
name: childNameJson,
slug: childSlug,
description: { id: childName, en: childName },
parentId: parentMenu.id,
updatedBy: adminUserId,
},
});
}
}
}
console.log('Seeding finished.');
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});