feat(kunden): Kundenverwaltung, Hostzuweisung und Token-Verwaltung (#006)
Kunden und Standorte pflegen, nicht zugeordnete Hosts in einem Schritt zuweisen, Enrollment- und Host-Tokens verwalten, Audit-Log. Dashboard, Kundenseiten und globale Suche laufen jetzt auf der Datenbank. 45 Tests. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,52 @@
|
||||
import { prisma } from "@/lib/db";
|
||||
import { protokolliere } from "@/server/audit";
|
||||
|
||||
export class ZuweisungsFehler extends Error {}
|
||||
|
||||
export interface ZuweisungsErgebnis {
|
||||
anzahl: number;
|
||||
kundenName: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Weist mehrere Hosts einem Kunden (und optional einem seiner Standorte) zu.
|
||||
* Getrennt von der Server Action, damit die Regeln ohne Next.js testbar sind.
|
||||
*/
|
||||
export async function hostsZuweisenService(
|
||||
hostIds: string[],
|
||||
kundeId: string | null,
|
||||
standortId: string | null,
|
||||
): Promise<ZuweisungsErgebnis> {
|
||||
if (hostIds.length === 0) {
|
||||
throw new ZuweisungsFehler("Bitte mindestens einen Host auswählen.");
|
||||
}
|
||||
if (!kundeId) {
|
||||
throw new ZuweisungsFehler("Bitte einen Kunden auswählen.");
|
||||
}
|
||||
|
||||
const kunde = await prisma.kunde.findUnique({
|
||||
where: { id: kundeId },
|
||||
include: { standorte: { select: { id: true } } },
|
||||
});
|
||||
if (!kunde) {
|
||||
throw new ZuweisungsFehler("Der gewählte Kunde existiert nicht mehr.");
|
||||
}
|
||||
if (standortId && !kunde.standorte.some((standort) => standort.id === standortId)) {
|
||||
throw new ZuweisungsFehler("Der gewählte Standort gehört nicht zu diesem Kunden.");
|
||||
}
|
||||
|
||||
const { count } = await prisma.host.updateMany({
|
||||
where: { id: { in: hostIds } },
|
||||
data: { kundeId, standortId },
|
||||
});
|
||||
|
||||
// Die Warnung „Host ohne Kunde“ ist damit erledigt (die Regel selbst folgt in #011).
|
||||
await prisma.alert.updateMany({
|
||||
where: { regel: "host-ohne-kunde", hostId: { in: hostIds }, erledigtAm: null },
|
||||
data: { erledigtAm: new Date() },
|
||||
});
|
||||
|
||||
await protokolliere("host.zugewiesen", "Host", null, { hostIds, kundeId, standortId, anzahl: count });
|
||||
|
||||
return { anzahl: count, kundenName: kunde.name };
|
||||
}
|
||||
Reference in New Issue
Block a user