Files
online-energieausweis/src/pages/api/geg-nachweis-wohnen/[uid].ts
2025-02-22 10:20:20 +11:00

212 lines
5.0 KiB
TypeScript

import { GEGNachweisWohnenClient, OptionalNullable, UUidWithPrefix, ZodOverlap } from "#components/Ausweis/types.js";
import { exclude } from "#lib/exclude.js";
import { authorizationHeaders, authorizationMiddleware } from "#lib/middleware/authorization.js";
import { GEGNachweisWohnenSchema, prisma } from "#lib/server/prisma";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
export const PATCH = defineApiRoute({
input: GEGNachweisWohnenSchema.omit({
uid: true,
id: true,
benutzer_id: true,
geg_einpreisung_id: true,
aufnahme_id: true,
}),
output: z.void(),
headers: {
"Authorization": z.string()
},
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const objekt = await prisma.gEGNachweisWohnen.findUnique({
where: {
uid: ctx.params.uid,
benutzer: {
id: user.id
}
}
})
if (!objekt) {
throw new APIError({
code: "NOT_FOUND",
message: "Nachweis konnte nicht gefunden werden oder gehört einem anderen Benutzer."
})
}
await prisma.gEGNachweisWohnen.update({
where: {
uid: ctx.params.uid
},
data: input
})
},
})
export const DELETE = defineApiRoute({
meta: {
description: "Storniert einen Nachweis"
},
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const { uid } = ctx.params;
if (!UUidWithPrefix.safeParse(uid).success) {
throw new APIError({
code: "BAD_REQUEST",
message: "UID konnte nicht verifiziert werden."
})
}
// Wir holen uns den BedarfsNachweis
// Dieser MUSS mit dem Nutzer verknüpft sein.
const nachweis = await prisma.gEGNachweisWohnen.findUnique({
where: {
uid,
}
});
if (!nachweis) {
// Falls wir den Nachweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
message: "Nachweis konnte nicht gefunden werden.",
});
}
// Wir dürfen den Nachweis nur stornieren, wenn er noch nicht ausgestellt wurde
// Außerdem müssen wir schauen, ob wir Admin oder der Besitzer des Nachweises sind.
if ((nachweis.benutzer_id !== user.id) && user.rolle !== "ADMIN") {
// Falls der Nachweis nicht dem Nutzer gehört, werfen wir einen Fehler
throw new APIError({
code: "FORBIDDEN",
message: "Nachweis gehört nicht dem Nutzer.",
});
}
// if (Nachweis.erledigt) {
// // Falls der Nachweis bereits ausgestellt wurde, werfen wir einen Fehler
// throw new TRPCError({
// code: "BAD_REQUEST",
// message: "Nachweis wurde bereits ausgestellt.",
// });
// }
if (nachweis.storniert) {
// Falls der Nachweis bereits storniert ist, werfen wir einen Fehler
throw new APIError({
code: "BAD_REQUEST",
message: "Nachweis wurde bereits storniert.",
});
}
await prisma.gEGNachweisWohnen.update({
where: {
id: nachweis.id
},
data: {
storniert: true
}
})
// Wir erstellen ein Event, dass der Nachweis storniert wurde
// Dann können wir das in der Historie anzeigen
await prisma.event.create({
data: {
title: "Nachweis storniert",
description: ((user.rolle === "ADMIN") && (nachweis.benutzer_id !== user.id)) ? "Nachweis wurde von einem Administrator storniert." : "Nachweis wurde vom Besitzer storniert.",
benutzer: {
connect: {
id: user.id
}
},
aufnahme: {
connect: {
id: nachweis.aufnahme_id
}
}
}
})
},
})
export const GET = defineApiRoute({
meta: {
description: "Gibt ein spezifisches Gebäude des Benutzers zurück.",
tags: ["Gebäude"],
headers: {
"Authorization": {
description: "Ein gültiger Authentifizierungstoken",
required: true,
allowEmptyValue: false,
examples: {
Bearer: {
value: "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
}
}
}
},
output: GEGNachweisWohnenSchema.merge(z.object({
uid_aufnahme: UUidWithPrefix,
uid_objekt: UUidWithPrefix,
uid_benutzer: UUidWithPrefix.optional()
})).omit({
id: true,
aufnahme_id: true,
benutzer_id: true
}),
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { uid } = context.params;
if (!uid) {
throw new APIError({
code: "BAD_REQUEST",
message: "Missing uid in request params"
})
}
const Nachweis = await prisma.gEGNachweisWohnen.findUnique({
where: {
uid,
benutzer_id: user.id
},
include: {
benutzer: {
select: {
uid: true
}
},
aufnahme: {
select: {
uid: true,
objekt: {
select: {
uid: true
}
}
}
}
}
});
if (!Nachweis) {
// Falls wir den Nachweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
message: "Nachweis konnte nicht gefunden werden.",
});
}
return {
uid_aufnahme: Nachweis.aufnahme.uid,
uid_objekt: Nachweis.aufnahme.objekt.uid,
uid_benutzer: Nachweis.benutzer?.uid,
...exclude(Nachweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"])
}
},
});