import { defaultAdminPermissions, permissions, type PermissionKey } from "@mrp/shared"; import { env } from "../config/env.js"; import { prisma } from "./prisma.js"; import { hashPassword } from "./password.js"; import { ensureDataDirectories } from "./storage.js"; const permissionDescriptions: Record = { [permissions.adminManage]: "Full administrative access", [permissions.companyRead]: "View company settings", [permissions.companyWrite]: "Update company settings", [permissions.crmRead]: "View CRM records", [permissions.crmWrite]: "Manage CRM records", [permissions.inventoryRead]: "View inventory items and BOMs", [permissions.inventoryWrite]: "Manage inventory items and BOMs", [permissions.manufacturingRead]: "View manufacturing work orders and execution data", [permissions.manufacturingWrite]: "Manage manufacturing work orders and execution data", [permissions.filesRead]: "View attached files", [permissions.filesWrite]: "Upload and manage attached files", [permissions.ganttRead]: "View planning workbench", [permissions.salesRead]: "View sales data", [permissions.salesWrite]: "Manage quotes and sales orders", [permissions.projectsRead]: "View projects and program records", [permissions.projectsWrite]: "Manage projects and program records", "purchasing.read": "View purchasing data", "purchasing.write": "Manage purchase orders", [permissions.shippingRead]: "View shipping data", [permissions.shippingWrite]: "Manage shipments", }; export async function bootstrapAppData() { await ensureDataDirectories(); for (const permissionKey of defaultAdminPermissions) { await prisma.permission.upsert({ where: { key: permissionKey }, update: {}, create: { key: permissionKey, description: permissionDescriptions[permissionKey], }, }); } const adminRole = await prisma.role.upsert({ where: { name: "Administrator" }, update: { description: "Full system access" }, create: { name: "Administrator", description: "Full system access", }, }); const allPermissions = await prisma.permission.findMany({ where: { key: { in: defaultAdminPermissions, }, }, }); for (const permission of allPermissions) { await prisma.rolePermission.upsert({ where: { roleId_permissionId: { roleId: adminRole.id, permissionId: permission.id, }, }, update: {}, create: { roleId: adminRole.id, permissionId: permission.id, }, }); } const adminUser = await prisma.user.upsert({ where: { email: env.ADMIN_EMAIL }, update: {}, create: { email: env.ADMIN_EMAIL, firstName: "System", lastName: "Administrator", passwordHash: await hashPassword(env.ADMIN_PASSWORD), }, }); await prisma.userRole.upsert({ where: { userId_roleId: { userId: adminUser.id, roleId: adminRole.id, }, }, update: {}, create: { userId: adminUser.id, roleId: adminRole.id, }, }); const existingProfile = await prisma.companyProfile.findFirst({ where: { isActive: true }, }); if (!existingProfile) { await prisma.companyProfile.create({ data: { companyName: "MRP Codex Manufacturing", legalName: "MRP Codex Manufacturing LLC", email: "operations@example.com", phone: "+1 (555) 010-2000", website: "https://example.com", taxId: "99-9999999", addressLine1: "100 Foundry Lane", addressLine2: "Suite 200", city: "Chicago", state: "IL", postalCode: "60601", country: "USA", }, }); } }