Organize/prisma/seed.ts

108 lines
2.9 KiB
TypeScript

import { PrismaClient } from "../lib/generated/prisma/client";
import { Role } from "../lib/generated/prisma/enums";
import { PrismaPg } from "@prisma/adapter-pg";
import bcrypt from "bcryptjs";
import { GROUP_COLORS } from "../lib/colors";
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });
async function main() {
const passwordHash = await bcrypt.hash("password123", 12);
const user = await prisma.user.upsert({
where: { email: "dev@example.com" },
update: {},
create: {
email: "dev@example.com",
passwordHash,
name: "Dev User",
role: Role.ADMIN,
},
});
console.log(`Seeded user: ${user.email} (password: password123)`);
const existingCategories = await prisma.category.count({
where: { userId: user.id },
});
if (existingCategories > 0) {
console.log("Sample board already exists for dev user, skipping.");
return;
}
const toDo = await prisma.category.create({
data: { name: "To Do", order: 0, userId: user.id },
});
const inProgress = await prisma.category.create({
data: { name: "In Progress", order: 1, userId: user.id },
});
const done = await prisma.category.create({
data: { name: "Done", order: 2, userId: user.id },
});
const groceries = await prisma.group.create({
data: {
title: "Groceries",
color: GROUP_COLORS[0].key,
order: 0,
categoryId: toDo.id,
noteContent: "## Weekly groceries\n\nDon't forget reusable bags!",
},
});
await prisma.todo.createMany({
data: [
{ title: "Milk", order: 0, groupId: groceries.id },
{ title: "Eggs", order: 1, groupId: groceries.id },
{ title: "Bread", order: 2, groupId: groceries.id, completed: true },
],
});
const homeProject = await prisma.group.create({
data: {
title: "Garage cleanup",
color: GROUP_COLORS[4].key,
order: 0,
categoryId: inProgress.id,
noteContent: "Sort boxes into keep / donate / trash piles.",
},
});
await prisma.todo.createMany({
data: [
{ title: "Sort tools", order: 0, groupId: homeProject.id },
{
title: "Donate old bikes",
order: 1,
groupId: homeProject.id,
details: "Call the community center about pickup times.",
},
],
});
const taxes = await prisma.group.create({
data: {
title: "2025 taxes",
color: GROUP_COLORS[6].key,
order: 0,
categoryId: done.id,
},
});
await prisma.todo.createMany({
data: [
{ title: "Gather receipts", order: 0, groupId: taxes.id, completed: true },
{ title: "File return", order: 1, groupId: taxes.id, completed: true },
],
});
console.log("Seeded sample board (3 categories, 3 groups, 7 to-dos).");
}
main()
.catch((e) => {
console.error(e);
process.exitCode = 1;
})
.finally(async () => {
await prisma.$disconnect();
});