import 'dotenv/config'; import { PrismaPg } from '@prisma/adapter-pg'; import { hash } from 'bcrypt'; import { PrismaClient } from '../src/generated/prisma/client.js'; import { DeviceStatus, Role } from '../src/generated/prisma/enums.js'; // Keep the seed executable with the same pg driver adapter used by PrismaService. const connectionString = process.env.DATABASE_URL; if (!connectionString) { throw new Error('DATABASE_URL is required to run seed'); } const prisma = new PrismaClient({ adapter: new PrismaPg({ connectionString }), }); async function main() { // Default seed login password (plain): Seed@1234 const seedPasswordHash = await hash('Seed@1234', 12); // Seed a baseline organization tree for local/demo usage. const hospital = (await prisma.hospital.findFirst({ where: { name: 'Demo Hospital' } })) ?? (await prisma.hospital.create({ data: { name: 'Demo Hospital' }, })); const department = (await prisma.department.findFirst({ where: { hospitalId: hospital.id, name: 'Neurosurgery', }, })) ?? (await prisma.department.create({ data: { hospitalId: hospital.id, name: 'Neurosurgery', }, })); const group = (await prisma.group.findFirst({ where: { departmentId: department.id, name: 'Shift-A', }, })) ?? (await prisma.group.create({ data: { departmentId: department.id, name: 'Shift-A', }, })); // Use openId as idempotent unique key for seeded users. const systemAdmin = await prisma.user.upsert({ where: { openId: 'seed-system-admin-openid' }, update: { name: 'System Admin', phone: '13800000000', passwordHash: seedPasswordHash, role: Role.SYSTEM_ADMIN, hospitalId: null, departmentId: null, groupId: null, }, create: { name: 'System Admin', phone: '13800000000', passwordHash: seedPasswordHash, openId: 'seed-system-admin-openid', role: Role.SYSTEM_ADMIN, }, }); await prisma.user.upsert({ where: { openId: 'seed-hospital-admin-openid' }, update: { name: 'Hospital Admin', phone: '13800000001', passwordHash: seedPasswordHash, role: Role.HOSPITAL_ADMIN, hospitalId: hospital.id, departmentId: department.id, groupId: group.id, }, create: { name: 'Hospital Admin', phone: '13800000001', passwordHash: seedPasswordHash, openId: 'seed-hospital-admin-openid', role: Role.HOSPITAL_ADMIN, hospitalId: hospital.id, departmentId: department.id, groupId: group.id, }, }); const doctor = await prisma.user.upsert({ where: { openId: 'seed-doctor-openid' }, update: { name: 'Doctor Demo', phone: '13800000002', passwordHash: seedPasswordHash, role: Role.DOCTOR, hospitalId: hospital.id, departmentId: department.id, groupId: group.id, }, create: { name: 'Doctor Demo', phone: '13800000002', passwordHash: seedPasswordHash, openId: 'seed-doctor-openid', role: Role.DOCTOR, hospitalId: hospital.id, departmentId: department.id, groupId: group.id, }, }); await prisma.user.upsert({ where: { openId: 'seed-engineer-openid' }, update: { name: 'Engineer Demo', phone: '13800000009', passwordHash: seedPasswordHash, role: Role.ENGINEER, hospitalId: hospital.id, departmentId: null, groupId: null, }, create: { name: 'Engineer Demo', phone: '13800000009', passwordHash: seedPasswordHash, openId: 'seed-engineer-openid', role: Role.ENGINEER, hospitalId: hospital.id, }, }); const patient = (await prisma.patient.findFirst({ where: { hospitalId: hospital.id, phone: '13800000003', idCardHash: 'seed-id-card-hash', }, })) ?? (await prisma.patient.create({ data: { hospitalId: hospital.id, doctorId: doctor.id, name: 'Patient Demo', phone: '13800000003', idCardHash: 'seed-id-card-hash', }, })); await prisma.device.upsert({ where: { snCode: 'SEED-SN-001' }, update: { patientId: patient.id, currentPressure: 110, status: DeviceStatus.ACTIVE, }, create: { snCode: 'SEED-SN-001', patientId: patient.id, currentPressure: 110, status: DeviceStatus.ACTIVE, }, }); console.log( JSON.stringify( { ok: true, hospitalId: hospital.id, departmentId: department.id, groupId: group.id, systemAdminId: systemAdmin.id, doctorId: doctor.id, patientId: patient.id, seedPasswordPlain: 'Seed@1234', }, null, 2, ), ); } main() .catch((error) => { console.error('Seed failed:', error); process.exitCode = 1; }) .finally(async () => { await prisma.$disconnect(); });