92 lines
2.6 KiB
TypeScript
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();
|
|
});
|