179 lines
4.0 KiB
TypeScript
179 lines
4.0 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 { VerbrauchsausweisWohnenSchema } from "src/generated/zod/verbrauchsausweiswohnen.js";
|
|
import { z } from "zod";
|
|
|
|
export const PATCH = defineApiRoute({
|
|
fetch(input, context) {},
|
|
});
|
|
|
|
export const PUT = defineApiRoute({
|
|
meta: {
|
|
contentTypes: ["application/json"],
|
|
description:
|
|
"Erstellt einen neuen Verbrauchsausweis 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: ["Verbrauchsausweis Wohnen"],
|
|
},
|
|
input: z.object({
|
|
ausweis: VerbrauchsausweisWohnenSchema.merge(
|
|
z.object({
|
|
startdatum: z.coerce.date().nullable(),
|
|
})
|
|
).omit({
|
|
id: true,
|
|
benutzer_id: true,
|
|
aufnahme_id: true,
|
|
rechnung_id: true,
|
|
created_at: true,
|
|
updated_at: true,
|
|
ausweisart: true,
|
|
alte_ausweis_id: true,
|
|
ausgestellt: true,
|
|
bestellt: true,
|
|
ausstellungsdatum: true,
|
|
kontrolldatei_angefragt: true,
|
|
registriernummer: true,
|
|
storniert: true,
|
|
zurueckgestellt: true,
|
|
}),
|
|
aufnahme_id: IDWithPrefix,
|
|
}),
|
|
output: z.object({
|
|
id: IDWithPrefix,
|
|
objekt_id: IDWithPrefix,
|
|
aufnahme_id: 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.VerbrauchsausweisWohnen
|
|
);
|
|
|
|
const ausweis = await prisma.verbrauchsausweisWohnen.create({
|
|
data: {
|
|
id,
|
|
...input.ausweis,
|
|
benutzer: {
|
|
connect: {
|
|
id: user.id,
|
|
},
|
|
},
|
|
aufnahme: {
|
|
connect: {
|
|
id: aufnahme.id,
|
|
},
|
|
},
|
|
},
|
|
select: {
|
|
id: true,
|
|
aufnahme: {
|
|
select: {
|
|
id: true,
|
|
objekt: {
|
|
select: {
|
|
id: true,
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
if (user.rolle !== Enums.BenutzerRolle.ADMIN) {
|
|
await sendAusweisGespeichertMail(user, id);
|
|
}
|
|
return {
|
|
id: ausweis.id,
|
|
objekt_id: ausweis.aufnahme.objekt.id,
|
|
aufnahme_id: ausweis.aufnahme.id,
|
|
};
|
|
},
|
|
});
|
|
|
|
export const GET = defineApiRoute({
|
|
meta: {
|
|
description:
|
|
"Gibt einen spezifischen Verbrauchsausweis Wohngebäude des Benutzers zurück.",
|
|
tags: ["Verbrauchsausweis Wohnen"],
|
|
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.verbrauchsausweisWohnen.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;
|
|
},
|
|
});
|