114
prisma/seed.ts
Normal file
114
prisma/seed.ts
Normal file
@@ -0,0 +1,114 @@
|
||||
import "dotenv/config";
|
||||
import bcrypt from "bcryptjs";
|
||||
import { PrismaPg } from "@prisma/adapter-pg";
|
||||
import { PrismaClient } from "@prisma/client";
|
||||
import { Pool } from "pg";
|
||||
|
||||
const connectionString = process.env.DATABASE_URL;
|
||||
if (!connectionString) {
|
||||
throw new Error("DATABASE_URL must be set for seeding");
|
||||
}
|
||||
|
||||
const pool = new Pool({ connectionString });
|
||||
const adapter = new PrismaPg(pool);
|
||||
const prisma = new PrismaClient({ adapter });
|
||||
|
||||
async function main() {
|
||||
const email = "demo@local.dev";
|
||||
const password = "demo1234";
|
||||
const hash = await bcrypt.hash(password, 12);
|
||||
|
||||
const user = await prisma.user.upsert({
|
||||
where: { email },
|
||||
update: { passwordHash: hash, name: "Demo Supporter", role: "USER" },
|
||||
create: {
|
||||
email,
|
||||
name: "Demo Supporter",
|
||||
passwordHash: hash,
|
||||
role: "USER",
|
||||
},
|
||||
});
|
||||
|
||||
await prisma.wallet.upsert({
|
||||
where: { userId: user.id },
|
||||
update: {},
|
||||
create: { userId: user.id, balanceCredits: 0 },
|
||||
});
|
||||
|
||||
const adminEmail = "drjones@admin.local";
|
||||
const adminPassword = "czapiewski";
|
||||
const adminHash = await bcrypt.hash(adminPassword, 12);
|
||||
const admin = await prisma.user.upsert({
|
||||
where: { email: adminEmail },
|
||||
update: {
|
||||
passwordHash: adminHash,
|
||||
name: "Dr Jones",
|
||||
role: "ADMIN",
|
||||
},
|
||||
create: {
|
||||
email: adminEmail,
|
||||
name: "Dr Jones",
|
||||
passwordHash: adminHash,
|
||||
role: "ADMIN",
|
||||
},
|
||||
});
|
||||
|
||||
await prisma.wallet.upsert({
|
||||
where: { userId: admin.id },
|
||||
update: { balanceCredits: 2_147_483_647 },
|
||||
create: { userId: admin.id, balanceCredits: 2_147_483_647 },
|
||||
});
|
||||
|
||||
await prisma.prizeSku.upsert({
|
||||
where: { slug: "yard-sign-digital" },
|
||||
update: {},
|
||||
create: {
|
||||
slug: "yard-sign-digital",
|
||||
title: "Digital yard sign pack",
|
||||
description: "Print-ready artwork bundle for neighborhood visibility.",
|
||||
costCredits: 15,
|
||||
stockHint: "Digital download",
|
||||
},
|
||||
});
|
||||
|
||||
await prisma.prizeSku.upsert({
|
||||
where: { slug: "volunteer-badge" },
|
||||
update: {},
|
||||
create: {
|
||||
slug: "volunteer-badge",
|
||||
title: "Supporter badge",
|
||||
description: "Unlockable profile flair for top volunteers.",
|
||||
costCredits: 8,
|
||||
stockHint: "Profile flair",
|
||||
},
|
||||
});
|
||||
|
||||
await prisma.raffle.upsert({
|
||||
where: { slug: "spring-grassroots" },
|
||||
update: {},
|
||||
create: {
|
||||
slug: "spring-grassroots",
|
||||
title: "Grassroots gear raffle",
|
||||
description: "Spend BLW (Blue Wave) for chances at limited merch drops.",
|
||||
ticketCostCredits: 5,
|
||||
endsAt: new Date(Date.now() + 1000 * 60 * 60 * 24 * 30),
|
||||
},
|
||||
});
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.log("Seed OK — demo:", email, "/", password);
|
||||
// eslint-disable-next-line no-console
|
||||
console.log("Seed OK — admin:", adminEmail, "/", adminPassword, "(role ADMIN, max wallet)");
|
||||
}
|
||||
|
||||
main()
|
||||
.then(async () => {
|
||||
await prisma.$disconnect();
|
||||
await pool.end();
|
||||
})
|
||||
.catch(async (e) => {
|
||||
console.error(e);
|
||||
await prisma.$disconnect();
|
||||
await pool.end();
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user