import { z } from "zod"; import { TicketsSchema, prisma } from "@ibcornelsen/database/server"; import { defineApiRoute } from "astro-typesafe-api/server"; import { maybeAuthorizationMiddleware } from "#lib/middleware/authorization.js"; import { UUidWithPrefix } from "#components/Ausweis/types.js"; export const PUT = defineApiRoute({ meta: { contentTypes: ["application/json"], description: "Erstellt ein neues Support Ticket und weist den Ersteller diesem zu, falls ein Authorization Header mitgegeben wurde.", summary: "Erstellt ein neues Support Ticket.", tags: ["Tickets"], }, input: TicketsSchema.omit({ bearbeiter_id: true, benutzer_id: true, created_at: true, deleted_at: true, id: true, prioritaet: true, status: true, uid: true, updated_at: true, }), output: z.object({ uid: UUidWithPrefix, }), middleware: maybeAuthorizationMiddleware, async fetch(input, ctx, user) { if (user === null) { // Der Benutzer ist nicht authentifiziert. // Wir erstellen das Ticket anonym. const ticket = await prisma.tickets.create({ data: { beschreibung: input.beschreibung, email: input.email, titel: input.titel, metadata: input.metadata, }, select: { uid: true, }, }); return { uid: ticket.uid, }; } // Der Benutzer ist authentifiziert. // Wir verlinken den Benutzer und das Ticket. const ticket = await prisma.tickets.create({ data: { benutzer: { connect: { id: user.id, }, }, beschreibung: input.beschreibung, email: input.email, titel: input.titel, metadata: input.metadata, }, select: { uid: true, }, }); return { uid: ticket.uid, }; }, });