167 lines
4.8 KiB
TypeScript
167 lines
4.8 KiB
TypeScript
// app/api/devices/[id]/route.ts
|
||
import { NextResponse } from 'next/server';
|
||
import { prisma } from '@/lib/prisma';
|
||
import type { Prisma } from '@prisma/client';
|
||
|
||
type RouteParams = { id: string };
|
||
|
||
export async function GET(
|
||
_req: Request,
|
||
ctx: { params: Promise<RouteParams> }, // 👈 params ist ein Promise
|
||
) {
|
||
const { id } = await ctx.params; // 👈 Promise auflösen
|
||
|
||
if (!id) {
|
||
return NextResponse.json({ error: 'MISSING_ID' }, { status: 400 });
|
||
}
|
||
|
||
try {
|
||
const device = await prisma.device.findUnique({
|
||
where: { inventoryNumber: id },
|
||
include: {
|
||
group: true,
|
||
location: true,
|
||
},
|
||
});
|
||
|
||
if (!device) {
|
||
return NextResponse.json({ error: 'NOT_FOUND' }, { status: 404 });
|
||
}
|
||
|
||
return NextResponse.json({
|
||
inventoryNumber: device.inventoryNumber,
|
||
name: device.name,
|
||
manufacturer: device.manufacturer,
|
||
model: device.model,
|
||
serialNumber: device.serialNumber,
|
||
productNumber: device.productNumber,
|
||
comment: device.comment,
|
||
ipv4Address: device.ipv4Address,
|
||
ipv6Address: device.ipv6Address,
|
||
macAddress: device.macAddress,
|
||
username: device.username,
|
||
group: device.group?.name ?? null,
|
||
location: device.location?.name ?? null,
|
||
createdAt: device.createdAt.toISOString(),
|
||
updatedAt: device.updatedAt.toISOString(),
|
||
});
|
||
} catch (err) {
|
||
console.error('[GET /api/devices/[id]]', err);
|
||
return NextResponse.json({ error: 'INTERNAL_ERROR' }, { status: 500 });
|
||
}
|
||
}
|
||
|
||
export async function PATCH(
|
||
req: Request,
|
||
ctx: { params: Promise<RouteParams> }, // 👈 hier auch
|
||
) {
|
||
const { id } = await ctx.params; // 👈 Promise auflösen
|
||
const body = await req.json();
|
||
|
||
try {
|
||
const existing = await prisma.device.findUnique({
|
||
where: { inventoryNumber: id },
|
||
});
|
||
|
||
if (!existing) {
|
||
return NextResponse.json({ error: 'NOT_FOUND' }, { status: 404 });
|
||
}
|
||
|
||
// Basis-Update-Daten
|
||
const data: Prisma.DeviceUpdateInput = {
|
||
name: body.name,
|
||
manufacturer: body.manufacturer,
|
||
model: body.model,
|
||
serialNumber: body.serialNumber,
|
||
productNumber: body.productNumber,
|
||
comment: body.comment,
|
||
ipv4Address: body.ipv4Address,
|
||
ipv6Address: body.ipv6Address,
|
||
macAddress: body.macAddress,
|
||
username: body.username,
|
||
};
|
||
|
||
// Gruppe (per Name) – Name ist @unique in DeviceGroup
|
||
if (body.group != null && body.group !== '') {
|
||
data.group = {
|
||
connectOrCreate: {
|
||
where: { name: body.group },
|
||
create: { name: body.group },
|
||
},
|
||
};
|
||
} else {
|
||
data.group = { disconnect: true };
|
||
}
|
||
|
||
// Standort (per Name) – Location.name ist @unique
|
||
if (body.location != null && body.location !== '') {
|
||
data.location = {
|
||
connectOrCreate: {
|
||
where: { name: body.location },
|
||
create: { name: body.location },
|
||
},
|
||
};
|
||
} else {
|
||
data.location = { disconnect: true };
|
||
}
|
||
|
||
const updated = await prisma.device.update({
|
||
where: { inventoryNumber: id },
|
||
data,
|
||
include: {
|
||
group: true,
|
||
location: true,
|
||
},
|
||
});
|
||
|
||
const snapshot: Prisma.JsonObject = {
|
||
inventoryNumber: updated.inventoryNumber,
|
||
name: updated.name,
|
||
manufacturer: updated.manufacturer,
|
||
model: updated.model,
|
||
serialNumber: updated.serialNumber,
|
||
productNumber: updated.productNumber,
|
||
comment: updated.comment,
|
||
ipv4Address: updated.ipv4Address,
|
||
ipv6Address: updated.ipv6Address,
|
||
macAddress: updated.macAddress,
|
||
username: updated.username,
|
||
passwordHash: updated.passwordHash,
|
||
group: updated.group?.name ?? null,
|
||
location: updated.location?.name ?? null,
|
||
createdAt: updated.createdAt.toISOString(),
|
||
updatedAt: updated.updatedAt.toISOString(),
|
||
};
|
||
|
||
await prisma.deviceHistory.create({
|
||
data: {
|
||
deviceId: updated.inventoryNumber,
|
||
changeType: 'UPDATED',
|
||
snapshot,
|
||
changedById: null,
|
||
},
|
||
});
|
||
|
||
return NextResponse.json({
|
||
inventoryNumber: updated.inventoryNumber,
|
||
name: updated.name,
|
||
manufacturer: updated.manufacturer,
|
||
model: updated.model,
|
||
serialNumber: updated.serialNumber,
|
||
productNumber: updated.productNumber,
|
||
comment: updated.comment,
|
||
ipv4Address: updated.ipv4Address,
|
||
ipv6Address: updated.ipv6Address,
|
||
macAddress: updated.macAddress,
|
||
username: updated.username,
|
||
group: updated.group?.name ?? null,
|
||
location: updated.location?.name ?? null,
|
||
createdAt: updated.createdAt.toISOString(),
|
||
updatedAt: updated.updatedAt.toISOString(),
|
||
});
|
||
} catch (err) {
|
||
console.error('[PATCH /api/devices/[id]]', err);
|
||
return NextResponse.json({ error: 'INTERNAL_ERROR' }, { status: 500 });
|
||
}
|
||
}
|