fp/services/our/prisma/seed.ts

92 lines
2.6 KiB
TypeScript

import { randomInt } from 'crypto';
import { PrismaClient } from '../generated/prisma';
import { withAccelerate } from '@prisma/extension-accelerate';
const prisma = new PrismaClient().$extends(withAccelerate());
const statuses = ['pending', 'approved', 'rejected'] as const;
function getRandomStatus() {
return statuses[Math.floor(Math.random() * statuses.length)];
}
async function main() {
console.log('🌱 Seeding database...');
const length = 9;
// Create Roles
await Promise.all([
prisma.role.create({ data: { name: 'user' } }),
prisma.role.create({ data: { name: 'admin' } }),
prisma.role.create({ data: { name: 'supporterTier1' } }),
prisma.role.create({ data: { name: 'supporterTier2' } }),
prisma.role.create({ data: { name: 'supporterTier3' } }),
prisma.role.create({ data: { name: 'supporterTier4' } }),
prisma.role.create({ data: { name: 'supporterTier5' } }),
prisma.role.create({ data: { name: 'supporterTier6' } }),
]);
// Create Users
const users = await Promise.all(
Array.from({ length }).map((_, i) =>
prisma.user.create({
data: {
patreonFullName: `User ${i + 1}`,
patreonId: `${randomInt(9558925894)}`,
imageUrl: 'https://placehold.co/48',
},
})
)
);
// Create Vtubers
const vtubers = await Promise.all(
['Alpha', 'Bravo', 'Charlie'].map((name) =>
prisma.vtuber.create({
data: {
displayName: name,
slug: name.toLowerCase(),
},
})
)
);
// Create Streams and VODs (with embedded upload data)
await Promise.all(
users.map((user, i) =>
prisma.vod.create({
data: {
uploader: { connect: { id: user.id } },
segmentKeys: [`vod${i + 1}_part1.mp4`, `vod${i + 1}_part2.mp4`],
streamDate: new Date(),
notes: `Seeded VOD ${i + 1}`,
status: getRandomStatus(),
hlsPlaylist: `https://cdn.example.com/hls/vod${i + 1}/index.m3u8`,
thumbnail: `https://placehold.co/320x180?text=VOD${i + 1}`,
vtubers: {
connect: [{ id: vtubers[i % vtubers.length].id }],
},
stream: {
create: {
date: new Date(),
announcementUrl: `https://example.com/announcement/${i + 1}`,
},
},
},
})
)
);
console.log(`✅ Seed complete with ${length} users and VODs (with vtubers)!`);
}
main()
.catch((e) => {
console.error('❌ Seed error:', e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});