Files
online-energieausweis/src/pages/api/bedarfsausweis-wohnen/index.ts
2025-04-29 10:39:11 -03:00

144 lines
3.3 KiB
TypeScript

import { IDWithPrefix } from "#components/Ausweis/types.js";
import { VALID_UUID_PREFIXES } from "#lib/constants.js";
import { generateIDWithPrefix } from "#lib/db.js";
import {
authorizationHeaders,
authorizationMiddleware,
} from "#lib/middleware/authorization.js";
import { sendAusweisGespeichertMail } from "#lib/server/mail/speichern-erfolgreich.js";
import { Enums, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { BedarfsausweisWohnenSchema } from "src/generated/zod/bedarfsausweiswohnen.js";
import { z } from "zod";
export const PUT = defineApiRoute({
meta: {
contentTypes: ["application/json"],
description:
"Erstellt einen neuen Bedarfsausweis für Wohngebäude nach dem Schema der EnEV von 2016. Als Input wird ein bestehendes Gebäude benötigt. Falls keine UID einer bestehenden Gebäudeaufnahme mitgegeben wird, wird automatisch eine erstellt.",
tags: ["Bedarfsausweis Wohnen"],
},
input: z.object({
ausweis: BedarfsausweisWohnenSchema.omit({
id: true,
benutzer_id: true,
aufnahme_id: true,
rechnung_id: true,
ausgestellt: true,
bestellt: true,
zurueckgestellt: true,
created_at: true,
updated_at: true,
storniert: true,
ausweisart: true
}),
aufnahme_id: IDWithPrefix,
}),
output: IDWithPrefix,
headers: authorizationHeaders,
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({
where: {
id: input.aufnahme_id,
},
});
if (!aufnahme || aufnahme.benutzer_id !== user.id) {
throw new APIError({
code: "FORBIDDEN",
message:
"Aufnahme konnte nicht gefunden werden oder gehört nicht zu diesem Benutzer.",
});
}
const id = generateIDWithPrefix(
9,
VALID_UUID_PREFIXES.BedarfsausweisWohnen
);
await prisma.bedarfsausweisWohnen.create({
data: {
id,
...input.ausweis,
benutzer: {
connect: {
id: user.id,
},
},
aufnahme: {
connect: {
id: aufnahme.id,
},
},
},
});
if (user.rolle === Enums.BenutzerRolle.USER) {
await sendAusweisGespeichertMail(user, id)
}
return 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...",
},
},
},
},
},
middleware: authorizationMiddleware,
async fetch(input, context, user) {
const { id } = context.params;
const ausweis = await prisma.bedarfsausweisWohnen.findUnique({
where: {
id,
},
include: {
benutzer: true,
aufnahme: {
include: {
bilder: true,
events: {
include: {
benutzer: {
select: {
id: true,
},
},
},
orderBy: {
date: "asc",
},
},
},
},
},
});
if (
!ausweis ||
(ausweis.benutzer_id !== null && ausweis.benutzer_id !== user.id)
) {
// Falls wir den Ausweis nicht finden können, werfen wir einen Fehler
throw new APIError({
code: "NOT_FOUND",
message: "Ausweis konnte nicht gefunden werden.",
});
}
return ausweis;
},
});