Files
online-energieausweis/src/pages/api/objekt/[id]/index.ts
2025-08-04 20:16:04 -04:00

85 lines
2.0 KiB
TypeScript

import { ObjektClient, OptionalNullable, ZodOverlap } from "#components/Ausweis/types.js";
import { exclude } from "#lib/exclude.js";
import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { Enums, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { ObjektSchema } from "src/generated/zod/objekt.js";
import { z } from "zod";
export const PATCH = defineApiRoute({
input: ObjektSchema.omit({
id: true,
benutzer_id: true,
erstellungsdatum: true
}),
output: z.void(),
headers: {
"Authorization": z.string()
},
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const objekt = await prisma.objekt.findUnique({
where: {
id: ctx.params.id
}
})
if (!objekt || (objekt.benutzer_id !== user.id && user.rolle !== Enums.BenutzerRolle.ADMIN)) {
throw new APIError({
code: "NOT_FOUND",
message: "Objekt konnte nicht gefunden werden."
})
}
await prisma.objekt.update({
where: {
id: ctx.params.id
},
data: input
})
},
})
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: ObjektSchema.omit({
benutzer_id: true,
id: true
}),
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const { id } = ctx.params;
const objekt = await prisma.objekt.findUnique({
where: user.rolle !== Enums.BenutzerRolle.ADMIN ? {
id,
benutzer_id: user.id
} : { id },
});
if (!objekt) {
throw new APIError({
code: "NOT_FOUND",
message: "Objekt mit dieser UID existiert nicht oder gehört nicht dem aktuellen Benutzer."
})
}
return exclude(objekt, ["benutzer_id", "id"])
},
});