Tests Verbessert

This commit is contained in:
Moritz Utcke
2025-02-05 10:55:12 +07:00
parent 9d5867839b
commit 5fc1dd8f80
35 changed files with 437 additions and 355 deletions

View File

@@ -61,7 +61,7 @@ Viele Grüße,
IBCornelsen`
})
if (info.rejected) {
if (info.rejected.length > 0) {
throw new APIError({
code: "INTERNAL_SERVER_ERROR",
message: "Etwas ist schiefgelaufen, bitte versuchen sie es erneut."

View File

@@ -0,0 +1,142 @@
import { z } from "zod";
import { Enums, RechnungSchema, prisma } from "@ibcornelsen/database/server";
import { TRPCError } from "@trpc/server";
import { mollieClient } from "#lib/mollie.js";
import { PaymentMethod } from "@mollie/api-client";
import { defineApiRoute } from "astro-typesafe-api/server";
import {
authorizationHeaders,
authorizationMiddleware,
} from "#lib/middleware/authorization.js";
export const PUT = defineApiRoute({
meta: {
contentTypes: ["application/json"],
description:
"Erstellt eine neue Rechnung mit der ein Energieausweis bezahlt werden kann. Gibt eine Checkout URL zurück, welche der Nutzer folgen muss, um zum Kaufabschluss zu gelangen.",
summary: "Erstellt eine neue Rechnung zu einem Energieausweis Vorgang.",
tags: ["Rechnungen"],
},
input: z
.object({
ausweisart: z.nativeEnum(Enums.Ausweisart),
uid: z.string().uuid(),
})
.merge(
RechnungSchema.omit({
benutzer_id: true,
bezahlt_am: true,
erstellt_am: true,
id: true,
status: true,
uid: true,
betrag: true,
storniert_am: true,
transaktions_referenz: true,
})
),
output: z.object({
checkout_url: z.string(),
uid: z.string().uuid(),
}),
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
// Wir erstellen eine Mollie Payment Referenz und eine neue Rechnung in unserer Datenbank, daraufhin geben
// wir eine Checkout URL zurück auf die der Nutzer weitergeleitet werden kann.
const { uid, ausweisart, bezahlmethode, services } = input;
// TODO: Services Implementieren
if (ausweisart === Enums.Ausweisart.BedarfsausweisWohnen) {
throw new TRPCError({
code: "BAD_REQUEST",
message: "Bedarfsausweis Wohnen wird noch nicht unterstützt.",
});
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisGewerbe) {
throw new TRPCError({
code: "BAD_REQUEST",
message:
"Verbrauchsausweis Gewerbe wird noch nicht unterstützt.",
});
} else if (ausweisart === Enums.Ausweisart.VerbrauchsausweisWohnen) {
// Wir müssen überprüfen, ob dem Nutzer der Ausweis tatsächlich gehört.
const ausweis = await prisma.verbrauchsausweisWohnen.findUnique({
where: {
uid,
},
});
if (!ausweis) {
throw new TRPCError({
code: "NOT_FOUND",
message: "Ausweis nicht gefunden.",
});
}
if (ausweis.benutzer_id !== user.id) {
throw new TRPCError({
code: "UNAUTHORIZED",
message: "Ausweis gehört nicht dem Nutzer.",
});
}
// Wir erstellen eine neue Rechnung in unserer Datenbank.
const rechnung = await prisma.rechnung.create({
data: {
benutzer_id: user.id,
betrag: 0,
bezahlmethode: bezahlmethode,
status: Enums.Rechnungsstatus.open,
aufnahme_id: ausweis.aufnahme_id,
},
select: {
uid: true,
betrag: true,
},
});
if (!rechnung) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: "Rechnung konnte nicht erstellt werden.",
});
}
// Wir erstellen eine Mollie Payment Referenz.
const payment = await mollieClient.payments.create({
amount: {
value: "45.00",
currency: "EUR",
},
metadata: {
rechnung_uid: rechnung.uid,
},
method: input.bezahlmethode as PaymentMethod,
description: "Verbrauchsausweis Wohnen 2016",
redirectUrl: "https://ibcornelsen.de/payment/success",
webhookUrl: "http://api.ibcornelsen.de/v1/webhooks/mollie",
});
const checkoutUrl = payment.getCheckoutUrl();
if (!checkoutUrl) {
throw new TRPCError({
code: "INTERNAL_SERVER_ERROR",
message: "Checkout URL konnte nicht erstellt werden.",
});
}
return {
uid: rechnung.uid,
checkout_url: checkoutUrl,
};
} else {
throw new TRPCError({
code: "BAD_REQUEST",
message: "Ausweisart nicht unterstützt.",
});
}
},
});