203 lines
4.9 KiB
JavaScript
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();
|
|
});
|