65 lines
1.5 KiB
TypeScript
65 lines
1.5 KiB
TypeScript
/**
|
|
* Der Webhook wird von Mollie ausgelöst, wenn sich der Status einer Transaktion ändert.
|
|
* https://docs.mollie.com/overview/webhooks
|
|
* @param _props { id: string }
|
|
*/
|
|
|
|
import { z } from "zod";
|
|
import { Enums, prisma } from "#lib/server/prisma.js";
|
|
import { mollieClient } from "#lib/mollie.js";
|
|
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
|
|
|
|
export const POST = defineApiRoute({
|
|
input: z.object({
|
|
id: z.string(),
|
|
}),
|
|
output: z.void(),
|
|
async fetch(input, ctx) {
|
|
const { id } = input;
|
|
|
|
// Wir holen uns die Transaktion von Mollie.
|
|
const payment = await mollieClient.payments.get(id);
|
|
const metadata = payment.metadata as { rechnung_id: string }
|
|
|
|
if (!payment) {
|
|
throw new APIError({
|
|
code: "NOT_FOUND",
|
|
message: "Transaktion nicht gefunden.",
|
|
});
|
|
}
|
|
|
|
if (!metadata.rechnung_id) {
|
|
throw new APIError({
|
|
code: "BAD_REQUEST",
|
|
message: "Rechnung UID nicht gefunden.",
|
|
});
|
|
}
|
|
|
|
// Wir holen uns die Rechnung aus unserer Datenbank.
|
|
const rechnung = await prisma.rechnung.findUnique({
|
|
where: {
|
|
id: metadata.rechnung_id,
|
|
},
|
|
});
|
|
|
|
if (!rechnung) {
|
|
throw new APIError({
|
|
code: "NOT_FOUND",
|
|
message: "Rechnung nicht gefunden.",
|
|
});
|
|
}
|
|
|
|
// Wir aktualisieren den Status der Rechnung.
|
|
await prisma.rechnung.update({
|
|
where: {
|
|
id: rechnung.id,
|
|
},
|
|
data: {
|
|
status: payment.status as Enums.Rechnungsstatus,
|
|
transaktions_referenz: payment.id,
|
|
bezahlt_am: new Date()
|
|
},
|
|
});
|
|
},
|
|
});
|