tyt-api-nest/prisma/seed.mjs
2026-03-13 00:19:34 +08:00

203 lines
4.9 KiB
JavaScript

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();
});