Files
online-energieausweis/src/pages/api/aufnahme/[uid]/bilder.ts
Moritz Utcke 973fd76d1a Bildupload fix
2025-03-19 12:21:06 -03:00

91 lines
1.9 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.findUnique({
where: {
uid
}
})
// Wenn das Bild bereits eine Aufnahme zugewiesen hat gehen wir einfach weiter.
if (img && img.aufnahme_id !== null) {
continue;
}
await tx.bild.update({
where: {
uid,
aufnahme_id: null
},
data: {
aufnahme_id: aufnahme.id
},
select: {
uid: true
}
})
}
})
},
})
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
},
})