import { prisma } from '../lib/prisma'; import { AppError } from '../types/index'; import type { VlanMode } from '../lib/constants'; const portInclude = { vlans: { include: { vlan: true } }, }; export async function updatePort( id: string, data: { label?: string; mode?: VlanMode; nativeVlan?: number | null; notes?: string; vlans?: Array<{ vlanId: string; tagged: boolean }>; } ) { const existing = await prisma.port.findUnique({ where: { id } }); if (!existing) throw new AppError('Port not found', 404, 'NOT_FOUND'); const { vlans: vlanAssignments, ...portData } = data; return prisma.$transaction(async (tx) => { await tx.port.update({ where: { id }, data: portData }); if (vlanAssignments !== undefined) { if (vlanAssignments.length > 0) { const vlanIds = vlanAssignments.map((v) => v.vlanId); const found = await tx.vlan.findMany({ where: { id: { in: vlanIds } } }); if (found.length !== vlanIds.length) { throw new AppError('One or more VLANs not found', 404, 'VLAN_NOT_FOUND'); } } await tx.portVlan.deleteMany({ where: { portId: id } }); if (vlanAssignments.length > 0) { await tx.portVlan.createMany({ data: vlanAssignments.map(({ vlanId, tagged }) => ({ portId: id, vlanId, tagged })), }); } } return tx.port.findUnique({ where: { id }, include: portInclude }); }); }