79 lines
2.3 KiB
TypeScript
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\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", "650303186e721b4bef0c3980")
|
|
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 {
|
|
id: ticket.id,
|
|
};
|
|
},
|
|
});
|