import { z } from "zod"; import { prisma } from "#lib/server/prisma.js"; import { defineApiRoute } from "astro-typesafe-api/server"; import { UUidWithPrefix } from "#components/Ausweis/types.js"; import { TicketsSchema } from "src/generated/zod/tickets.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, }), async fetch(input, ctx) { const ticket = await prisma.tickets.create({ data: { beschreibung: input.beschreibung, email: input.email, titel: input.titel, metadata: input.metadata, }, select: { uid: true, }, }); // Das sind die Label IDs von Trello const labels = { "Technischer Fehler": "67d75d797c0884eeb3873623", "Fehlende Funktionalität": "67d75d60b1c1b1037e7444c4", }; const category = (input.metadata as Record).category const url = new URL("https://api.trello.com/1/cards") url.searchParams.append("name", input.titel) url.searchParams.append("desc", `User: ${input.email}\n\nDescription: ${input.beschreibung}\n\nCategory: ${category}`) url.searchParams.append("pos", "top") url.searchParams.append("idLabels", (category && labels[category as keyof typeof labels]) || "650e909fdc09629a4d6d495d") url.searchParams.append("key", "e057eb39018368ea96e456c753ac41b4") url.searchParams.append("idList", "67d75ca7403fd22c49bc7447") url.searchParams.append("token", "ATTA8b65b3587ab627167038cc32a3460650973eb181cde01dabb208ca1e90ed5467AC06A4F2") // Wir laden das Ticket zu Trello hoch. const result = await fetch(url, { headers: { Accept: "application/json" }, method: "POST" }); console.log(await result.text()); return { uid: ticket.uid, }; }, });