172 lines
4.8 KiB
JavaScript
172 lines
4.8 KiB
JavaScript
import bcrypt from "bcryptjs";
|
||
import { PrismaClient } from "@prisma/client";
|
||
|
||
const prisma = new PrismaClient();
|
||
|
||
async function main() {
|
||
const adminEmail = "admin@ywyw.com";
|
||
const customerEmail = "cust@ywyw.com";
|
||
|
||
const passwordHash = await bcrypt.hash("Dev1234#", 10);
|
||
|
||
const admin = await prisma.user.upsert({
|
||
where: { email: adminEmail },
|
||
update: {},
|
||
create: {
|
||
email: adminEmail,
|
||
name: "Admin User",
|
||
role: "ADMIN",
|
||
firstName: "Admin",
|
||
lastName: "User",
|
||
gender: "OTHER",
|
||
emailVerified: true,
|
||
forcePasswordReset: false,
|
||
isActive: true,
|
||
},
|
||
});
|
||
|
||
await prisma.credential.upsert({
|
||
where: { userId: admin.id },
|
||
update: { password: passwordHash },
|
||
create: { userId: admin.id, password: passwordHash },
|
||
});
|
||
|
||
console.log("✅ Admin user created:", adminEmail);
|
||
|
||
const customer = await prisma.user.upsert({
|
||
where: { email: customerEmail },
|
||
update: {},
|
||
create: {
|
||
email: customerEmail,
|
||
name: "Customer User",
|
||
role: "USER",
|
||
firstName: "Customer",
|
||
lastName: "User",
|
||
gender: "OTHER",
|
||
emailVerified: true,
|
||
forcePasswordReset: false,
|
||
isActive: true,
|
||
},
|
||
});
|
||
|
||
await prisma.credential.upsert({
|
||
where: { userId: customer.id },
|
||
update: { password: passwordHash },
|
||
create: { userId: customer.id, password: passwordHash },
|
||
});
|
||
|
||
console.log("✅ Customer user created:", customerEmail);
|
||
|
||
const existingWebinars = await prisma.webinar.count();
|
||
if (existingWebinars === 0) {
|
||
const now = Date.now();
|
||
const sample = [
|
||
{
|
||
title: "Estate Planning Fundamentals",
|
||
description: "Learn the foundations of estate planning, wills, and trusts.",
|
||
speaker: "Emily Roberts",
|
||
startAt: new Date(now + 7 * 86400000),
|
||
duration: 90,
|
||
bannerUrl: null,
|
||
category: "Basics",
|
||
visibility: "PUBLIC",
|
||
isActive: true,
|
||
capacity: 50,
|
||
priceCents: 0,
|
||
learningPoints: [
|
||
"Understanding the basics of wills and trusts",
|
||
"Key differences between revocable and irrevocable trusts",
|
||
"Common estate planning mistakes to avoid",
|
||
"When to update your estate plan",
|
||
],
|
||
meetingInfo: {},
|
||
},
|
||
{
|
||
title: "Avoiding Probate: Strategies & Solutions",
|
||
description: "Practical strategies to reduce or avoid probate delays.",
|
||
speaker: "David Martinez",
|
||
startAt: new Date(now + 10 * 86400000),
|
||
duration: 75,
|
||
bannerUrl: null,
|
||
category: "Planning",
|
||
visibility: "PUBLIC",
|
||
isActive: true,
|
||
capacity: 60,
|
||
priceCents: 0,
|
||
learningPoints: [
|
||
"How probate works and why it can be costly",
|
||
"Living trusts as probate avoidance tools",
|
||
"Joint ownership strategies",
|
||
"Beneficiary designations and their importance",
|
||
],
|
||
meetingInfo: {},
|
||
},
|
||
{
|
||
title: "Tax-Efficient Wealth Transfer",
|
||
description: "Minimize taxes when transferring assets to heirs.",
|
||
speaker: "Susan Chen",
|
||
startAt: new Date(now + 14 * 86400000),
|
||
duration: 60,
|
||
bannerUrl: null,
|
||
category: "Advanced",
|
||
visibility: "PUBLIC",
|
||
isActive: true,
|
||
capacity: 40,
|
||
priceCents: 0,
|
||
learningPoints: [
|
||
"Federal and state estate tax basics",
|
||
"Gift tax exclusions and lifetime exemptions",
|
||
"Charitable giving strategies",
|
||
"Generation-skipping transfer tax considerations",
|
||
],
|
||
meetingInfo: {},
|
||
},
|
||
];
|
||
|
||
for (const w of sample) {
|
||
await prisma.webinar.create({ data: w });
|
||
}
|
||
|
||
console.log(`✅ Created ${sample.length} sample webinars`);
|
||
} else {
|
||
console.log(`ℹ️ Skipped webinar seeding - ${existingWebinars} already exist`);
|
||
}
|
||
|
||
const existingRegistrations = await prisma.webinarRegistration.count();
|
||
if (existingRegistrations === 0) {
|
||
const webinars = await prisma.webinar.findMany({ take: 2 });
|
||
if (webinars.length >= 2) {
|
||
await prisma.webinarRegistration.create({
|
||
data: {
|
||
userId: customer.id,
|
||
webinarId: webinars[0].id,
|
||
status: "CONFIRMED",
|
||
},
|
||
});
|
||
|
||
await prisma.webinarRegistration.create({
|
||
data: {
|
||
userId: customer.id,
|
||
webinarId: webinars[1].id,
|
||
status: "CONFIRMED",
|
||
},
|
||
});
|
||
|
||
console.log("✅ Created sample registrations for customer");
|
||
}
|
||
} else {
|
||
console.log(`ℹ️ Skipped registration seeding - ${existingRegistrations} already exist`);
|
||
}
|
||
}
|
||
|
||
main()
|
||
.then(async () => {
|
||
await prisma.$disconnect();
|
||
console.log("✅ Seeding completed successfully");
|
||
})
|
||
.catch(async (e) => {
|
||
console.error("❌ Seeding failed:", e);
|
||
await prisma.$disconnect();
|
||
process.exit(1);
|
||
});
|