import { z } from "zod"; import { prisma } from "#lib/server/prisma.js"; import { defineApiRoute } from "astro-typesafe-api/server"; import { IDWithPrefix } from "#components/Ausweis/types.js"; import { TicketsSchema } from "src/generated/zod/tickets.js"; import { generateIDWithPrefix } from "#lib/db.js"; import { VALID_UUID_PREFIXES } from "#lib/constants.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, updated_at: true, }), output: z.object({ id: IDWithPrefix, }), async fetch(input, ctx) { const id = generateIDWithPrefix(9, VALID_UUID_PREFIXES.Ticket) const ticket = await prisma.tickets.create({ data: { id, beschreibung: input.beschreibung, email: input.email, titel: input.titel, metadata: input.metadata, } }); // 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\nKategorie: ${category}\n\nTelefon: ${(input.metadata as Record).telefon || "Nicht angegeben"}`) 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", "ATTA6f1774d98472db1897a2373ee7b55ab15f218c2445b6609dfef3071fe5203a90DB15678A") // Wir laden das Ticket zu Trello hoch. const result = await fetch(url, { headers: { Accept: "application/json" }, method: "POST" }); console.log(await result.text()); return { id: ticket.id, }; }, });