import { OptionalNullable, VerbrauchsausweisWohnenClient, ZodOverlap } from "#components/Ausweis/types.js"; import { exclude } from "#lib/exclude.js"; import { authorizationMiddleware } from "#lib/middleware/authorization.js"; import { prisma, VerbrauchsausweisWohnenSchema } from "@ibcornelsen/database/server"; import { APIError, defineApiRoute } from "astro-typesafe-api/server"; import { z } from "zod"; export const PATCH = defineApiRoute({ input: VerbrauchsausweisWohnenSchema.omit({ uid: true, id: true, benutzer_id: true, aufnahme_id: true, }), output: z.void(), headers: { "Authorization": z.string() }, middleware: authorizationMiddleware, async fetch(input, ctx, user) { const objekt = await prisma.verbrauchsausweisWohnen.findUnique({ where: { uid: ctx.params.uid, benutzer: { id: user.id } } }) if (!objekt) { throw new APIError({ code: "NOT_FOUND", message: "Ausweis konnte nicht gefunden werden oder gehört einem anderen Benutzer." }) } await prisma.verbrauchsausweisWohnen.update({ where: { uid: ctx.params.uid }, 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: ZodOverlap>(VerbrauchsausweisWohnenSchema.merge(z.object({ uid_aufnahme: z.string().uuid(), uid_objekt: z.string().uuid(), uid_benutzer: z.string().uuid().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 ausweis = await prisma.verbrauchsausweisWohnen.findUnique({ where: { uid, benutzer_id: user.id }, include: { benutzer: { select: { uid: true } }, aufnahme: { select: { uid: true, objekt: { select: { uid: true } } } } } }); if (!ausweis) { // 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 { uid_aufnahme: ausweis.aufnahme.uid, uid_objekt: ausweis.aufnahme.objekt.uid, uid_benutzer: ausweis.benutzer?.uid, ...exclude(ausweis, ["id", "aufnahme_id", "benutzer_id", "aufnahme"]) } }, });