Files
online-energieausweis/src/pages/api/aufnahme/[uid]/bilder.ts
2025-03-15 20:51:37 -03:00

86 lines
1.8 KiB
TypeScript

import { authorizationMiddleware } from "#lib/middleware/authorization.js";
import { Enums, prisma } from "#lib/server/prisma.js";
import { APIError, defineApiRoute } from "astro-typesafe-api/server";
import { z } from "zod";
import { UUidWithPrefix } from "#components/Ausweis/types.js";
import { BildSchema } from "src/generated/zod/bild.js";
export const PUT = defineApiRoute({
input: z.array(UUidWithPrefix),
output: z.void(),
middleware: authorizationMiddleware,
async fetch(input, ctx, user) {
const aufnahme = await prisma.aufnahme.findUnique({
where: {
uid: ctx.params.uid
}
})
if (!aufnahme) {
throw new APIError({
code: "NOT_FOUND",
message: "Aufnahme existiert nicht oder gehört einem anderen Benutzer."
})
}
prisma.$transaction(async tx => {
for (const uid of input) {
const img = await tx.bild.update({
where: {
uid,
aufnahme_id: null
},
data: {
aufnahme_id: aufnahme.id
},
select: {
uid: true
}
})
if (!img) {
throw new APIError({
code: "NOT_FOUND",
message: "Bild existiert nicht oder gehört bereits zu einer anderen Aufnahme."
})
}
}
})
},
})
export const GET = defineApiRoute({
middleware: authorizationMiddleware,
output: z.array(BildSchema.pick({
kategorie: true,
uid: true
})),
async fetch(input, ctx, user) {
const { uid } = ctx.params;
const aufnahme = await prisma.aufnahme.findUnique({
where: user.rolle === Enums.BenutzerRolle.USER ? {
uid,
benutzer_id: user.id
} : { uid },
select: {
benutzer_id: true,
bilder: {
select: {
kategorie: true,
uid: true
}
}
}
})
if (!aufnahme) {
throw new APIError({
code: "NOT_FOUND",
message: "Aufnahme existiert nicht oder gehört einem anderen Benutzer."
})
}
return aufnahme.bilder
},
})