geraete/prisma/seed.ts
2025-11-26 08:02:48 +01:00

225 lines
5.8 KiB
TypeScript

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