// prisma/seed.ts import 'dotenv/config'; import { PrismaClient } from '../generated/prisma/client'; import { PrismaPg } from '@prisma/adapter-pg'; import { hash } from 'bcryptjs'; const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL, }); const prisma = new PrismaClient({ adapter }); // Location.name ist @unique → upsert per name async function ensureLocation(name: string) { return prisma.location.upsert({ where: { name }, update: {}, create: { name }, }); } async function main() { const email = 'christoph.rother@polizei.nrw.de'; const arbeitsname = 'Admin'; // ✔ Schreibweise wie im Schema const nwkennung = 'nw083118'; // ✔ optional, aber sinnvoll const password = 'Timmy0104199?'; const passwordHash = await hash(password, 10); // User anlegen / aktualisieren const user = await prisma.user.upsert({ where: { nwkennung }, update: { email, arbeitsname, passwordHash }, create: { nwkennung, email, arbeitsname, passwordHash }, }); // Rollen anlegen const [adminRole, inventurRole, readonlyRole] = await Promise.all([ prisma.role.upsert({ where: { name: 'ADMIN' }, update: {}, create: { name: 'ADMIN' }, }), prisma.role.upsert({ where: { name: 'INVENTUR' }, update: {}, create: { name: 'INVENTUR' }, }), prisma.role.upsert({ where: { name: 'READONLY' }, update: {}, create: { name: 'READONLY' }, }), ]); // User-Rolle ADMIN zuweisen await prisma.userRole.upsert({ where: { userId_roleId: { userId: user.nwkennung, roleId: adminRole.id, }, }, update: {}, create: { userId: user.nwkennung, roleId: adminRole.id, }, }); // Device-Gruppen anlegen const dienstrechnerGroup = await prisma.deviceGroup.upsert({ where: { name: 'Dienstrechner' }, // name ist @unique update: {}, create: { name: 'Dienstrechner' }, }); const monitoreGroup = await prisma.deviceGroup.upsert({ where: { name: 'Monitore' }, update: {}, create: { name: 'Monitore' }, }); // Standorte anlegen const raum112 = await ensureLocation('Raum 1.12'); const lagerKeller = await ensureLocation('Lager Keller'); // Geräte anlegen / aktualisieren (inventoryNumber ist @id/@unique) const device1 = await prisma.device.upsert({ where: { inventoryNumber: '1' }, update: { // hier könntest du bei erneutem Seed z.B. Hersteller/Model aktualisieren }, create: { inventoryNumber: '1', name: 'Dienstrechner Sachbearbeitung 1', manufacturer: 'Dell', model: 'OptiPlex 7010', serialNumber: 'SN-ABC-123', productNumber: 'PN-4711', comment: 'Steht am Fensterplatz', ipv4Address: '10.0.0.12', ipv6Address: null, macAddress: '00-11-22-33-44-55', username: 'sachb1', groupId: dienstrechnerGroup.id, locationId: raum112.id, createdById: user.nwkennung, updatedById: user.nwkennung, tags: { connectOrCreate: [ { where: { name: 'Dienstrechner' }, create: { name: 'Dienstrechner' }, }, { where: { name: 'Büro' }, create: { name: 'Büro' }, }, { where: { name: 'Windows' }, create: { name: 'Windows' }, }, ], }, }, }); // Zubehör-Gerät 1-1 (Dockingstation zu Gerät 1) const device1_1 = await prisma.device.upsert({ where: { inventoryNumber: '1-1' }, update: { parentDeviceId: device1.inventoryNumber, groupId: dienstrechnerGroup.id, locationId: raum112.id, }, create: { inventoryNumber: '1-1', name: 'Dockingstation zu Sachbearbeitung 1', manufacturer: 'Dell', model: 'WD19', serialNumber: 'SN-DOCK-1', productNumber: 'PN-DOCK-1', comment: 'Zubehör zu Gerät 1', ipv4Address: null, ipv6Address: null, macAddress: null, username: null, groupId: dienstrechnerGroup.id, locationId: raum112.id, createdById: user.nwkennung, updatedById: user.nwkennung, parentDeviceId: device1.inventoryNumber, tags: { connectOrCreate: [ { where: { name: 'Zubehör' }, create: { name: 'Zubehör' }, }, { where: { name: 'Dockingstation' }, create: { name: 'Dockingstation' }, }, ], }, }, }); const device2 = await prisma.device.upsert({ where: { inventoryNumber: '2' }, update: {}, create: { inventoryNumber: '2', name: 'Monitor Lager 27"', manufacturer: 'Samsung', model: 'S27F350', serialNumber: 'SN-DEF-456', productNumber: 'PN-0815', comment: null, ipv4Address: null, ipv6Address: null, macAddress: null, username: null, groupId: monitoreGroup.id, locationId: lagerKeller.id, createdById: user.nwkennung, updatedById: user.nwkennung, tags: { connectOrCreate: [ { where: { name: 'Monitor' }, create: { name: 'Monitor' }, }, { where: { name: 'Lager' }, create: { name: 'Lager' }, }, ], }, }, }); console.log('Test-User und Beispieldaten angelegt/aktualisiert:'); console.log(` Email: ${user.email}`); console.log(` Arbeitsname: ${user.arbeitsname}`); console.log(` NW-Kennung: ${user.nwkennung}`); console.log(` Passwort: ${password}`); console.log( ' Devices: ', device1.inventoryNumber, device1_1.inventoryNumber, device2.inventoryNumber, ); } main() .catch((e) => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });