Files
online-energieausweis/src/pages/api/ticket/index.ts
2025-08-04 17:23:04 -04:00

79 lines
2.3 KiB
TypeScript

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<string, string>).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<string, string>).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,
};
},
});