You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
3.4 KiB
110 lines
3.4 KiB
import { PrismaClient, Role, ZoneCode } from '@prisma/client'; |
|
import bcrypt from 'bcrypt'; |
|
|
|
const prisma = new PrismaClient(); |
|
|
|
const SEED_USERS: Array<{ |
|
email: string; |
|
fullName: string; |
|
role: Role; |
|
passwordEnv: string; |
|
passwordFallback: string; |
|
}> = [ |
|
{ |
|
email: 'manager@local', |
|
fullName: 'Иван Управляющий', |
|
role: Role.MANAGER, |
|
passwordEnv: 'SEED_PASSWORD_MANAGER', |
|
passwordFallback: 'manager123', |
|
}, |
|
{ |
|
email: 'senior@local', |
|
fullName: 'Мария Старший Администратор', |
|
role: Role.SENIOR_ADMIN, |
|
passwordEnv: 'SEED_PASSWORD_SENIOR', |
|
passwordFallback: 'senior123', |
|
}, |
|
{ |
|
email: 'security@local', |
|
fullName: 'Пётр Безопасность', |
|
role: Role.SECURITY, |
|
passwordEnv: 'SEED_PASSWORD_SECURITY', |
|
passwordFallback: 'security123', |
|
}, |
|
{ |
|
email: 'admin@local', |
|
fullName: 'Анна Админ Системы', |
|
role: Role.SYSADMIN, |
|
passwordEnv: 'SEED_PASSWORD_SYSADMIN', |
|
passwordFallback: 'admin123', |
|
}, |
|
]; |
|
|
|
const SEED_ZONES: Array<{ code: ZoneCode; name: string }> = [ |
|
{ code: ZoneCode.A, name: 'Вход в клинику' }, |
|
{ code: ZoneCode.B, name: 'Коридор / зона ожидания' }, |
|
{ code: ZoneCode.C, name: 'Стойка рецепции' }, |
|
{ code: ZoneCode.D, name: 'Перед кабинетом врача' }, |
|
{ code: ZoneCode.E, name: 'В кабинете врача' }, |
|
]; |
|
|
|
const SEED_CAMERAS: Array<{ name: string; zoneCode: ZoneCode }> = [ |
|
{ name: 'cam-entrance', zoneCode: ZoneCode.A }, |
|
{ name: 'cam-corridor', zoneCode: ZoneCode.B }, |
|
// На рецепции 4 рабочих места — отдельная камера на каждое (С1…С4). |
|
{ name: 'cam-reception-1', zoneCode: ZoneCode.C }, |
|
{ name: 'cam-reception-2', zoneCode: ZoneCode.C }, |
|
{ name: 'cam-reception-3', zoneCode: ZoneCode.C }, |
|
{ name: 'cam-reception-4', zoneCode: ZoneCode.C }, |
|
{ name: 'cam-doctor-waiting', zoneCode: ZoneCode.D }, |
|
{ name: 'cam-doctor-office', zoneCode: ZoneCode.E }, |
|
]; |
|
|
|
async function main() { |
|
console.log('🌱 Seeding reception database...'); |
|
|
|
// Users |
|
for (const u of SEED_USERS) { |
|
const password = process.env[u.passwordEnv] ?? u.passwordFallback; |
|
const passwordHash = await bcrypt.hash(password, 10); |
|
await prisma.user.upsert({ |
|
where: { email: u.email }, |
|
update: { fullName: u.fullName, role: u.role, passwordHash, isActive: true }, |
|
create: { email: u.email, fullName: u.fullName, role: u.role, passwordHash, isActive: true }, |
|
}); |
|
console.log(` ✓ user ${u.email} (${u.role})`); |
|
} |
|
|
|
// Zones |
|
for (const z of SEED_ZONES) { |
|
await prisma.zone.upsert({ |
|
where: { code: z.code }, |
|
update: { name: z.name }, |
|
create: z, |
|
}); |
|
console.log(` ✓ zone ${z.code} — ${z.name}`); |
|
} |
|
|
|
// Cameras (bound to zones) |
|
for (const c of SEED_CAMERAS) { |
|
const zone = await prisma.zone.findUniqueOrThrow({ where: { code: c.zoneCode } }); |
|
await prisma.camera.upsert({ |
|
where: { name: c.name }, |
|
update: { zoneId: zone.id }, |
|
create: { name: c.name, zoneId: zone.id }, |
|
}); |
|
console.log(` ✓ camera ${c.name} → zone ${c.zoneCode}`); |
|
} |
|
|
|
console.log('✅ Seed complete.'); |
|
} |
|
|
|
main() |
|
.then(async () => { |
|
await prisma.$disconnect(); |
|
}) |
|
.catch(async (e) => { |
|
console.error(e); |
|
await prisma.$disconnect(); |
|
process.exit(1); |
|
});
|
|
|