"use server"; import { revalidatePath } from "next/cache"; import { UserRole } from "@prisma/client"; import { z } from "zod"; import { requireRole } from "@/lib/auth-utils"; import { prisma } from "@/lib/prisma"; const dutySchema = z.object({ name: z.string().min(2, "Name muss mindestens 2 Zeichen lang sein").max(50), description: z.string().trim().max(2000).optional(), }); export async function createDuty(rawPayload: unknown) { const session = await requireRole([UserRole.ADMIN]); const kitaId = session.user.kitaId; if (!kitaId) { return { error: "Kein Mandant zugeordnet." }; } const parsed = dutySchema.safeParse(rawPayload); if (!parsed.success) { return { error: "Ungültige Eingabedaten." }; } try { await prisma.parentDuty.create({ data: { kitaId, name: parsed.data.name, description: parsed.data.description, }, }); revalidatePath("/dashboard/families"); revalidatePath("/dashboard/adressbuch"); return { success: true }; } catch (error) { console.error("Fehler beim Erstellen des Amtes:", error); return { error: "Ein Fehler ist aufgetreten (evtl. existiert der Name bereits)." }; } } export async function deleteDuty(dutyId: string) { const session = await requireRole([UserRole.ADMIN]); const kitaId = session.user.kitaId; if (!kitaId) { return { error: "Kein Mandant zugeordnet." }; } try { await prisma.parentDuty.delete({ where: { id: dutyId, kitaId, }, }); revalidatePath("/dashboard/families"); revalidatePath("/dashboard/adressbuch"); return { success: true }; } catch (error) { console.error("Fehler beim Löschen des Amtes:", error); return { error: "Ein Fehler ist aufgetreten." }; } } export async function assignDuty(userId: string, dutyId: string) { const session = await requireRole([UserRole.ADMIN]); const kitaId = session.user.kitaId; if (!kitaId) { return { error: "Kein Mandant zugeordnet." }; } try { const [user, duty] = await Promise.all([ prisma.user.findFirst({ where: { id: userId, kitaId }, select: { id: true }, }), prisma.parentDuty.findFirst({ where: { id: dutyId, kitaId }, select: { id: true }, }), ]); if (!user || !duty) { return { error: "Nutzer oder Amt gehört nicht zu dieser Kita." }; } // Check if assignment already exists const existing = await prisma.parentDutyAssignment.findUnique({ where: { dutyId_userId: { dutyId, userId }, }, }); if (existing) { return { error: "Der Nutzer hat dieses Amt bereits." }; } await prisma.parentDutyAssignment.create({ data: { kitaId, userId: userId, dutyId: dutyId, }, }); revalidatePath("/dashboard/families"); revalidatePath("/dashboard/adressbuch"); return { success: true }; } catch (error) { console.error("Fehler beim Zuweisen des Amtes:", error); return { error: "Ein Fehler ist aufgetreten." }; } } export async function removeDutyAssignment(assignmentId: string) { const session = await requireRole([UserRole.ADMIN]); const kitaId = session.user.kitaId; if (!kitaId) { return { error: "Kein Mandant zugeordnet." }; } try { await prisma.parentDutyAssignment.delete({ where: { id: assignmentId, kitaId, }, }); revalidatePath("/dashboard/families"); revalidatePath("/dashboard/adressbuch"); return { success: true }; } catch (error) { console.error("Fehler beim Entfernen des Amtes:", error); return { error: "Ein Fehler ist aufgetreten." }; } }