68 lines
1.7 KiB
TypeScript
68 lines
1.7 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { promises as fs } from "fs";
|
|
import path from "path";
|
|
import { prisma } from "../../../../lib/prisma";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
export const revalidate = 0;
|
|
|
|
const DATA_DIR = path.join(process.cwd(), "prisma", "data");
|
|
|
|
const resolveLogoPath = (relativePath: string) => {
|
|
const absolutePath = path.join(DATA_DIR, relativePath);
|
|
if (!absolutePath.startsWith(DATA_DIR)) {
|
|
throw new Error("Ungültiger Pfad.");
|
|
}
|
|
return absolutePath;
|
|
};
|
|
|
|
const getLogoSettings = async () => {
|
|
const pathSetting = await prisma.setting.findUnique({
|
|
where: { key: "app_logo_path" }
|
|
});
|
|
const typeSetting = await prisma.setting.findUnique({
|
|
where: { key: "app_logo_type" }
|
|
});
|
|
|
|
if (!pathSetting?.value || !typeSetting?.value) {
|
|
return null;
|
|
}
|
|
|
|
return { path: pathSetting.value, type: typeSetting.value };
|
|
};
|
|
|
|
export async function GET() {
|
|
const settings = await getLogoSettings();
|
|
if (!settings) {
|
|
return NextResponse.json({ error: "Kein Logo vorhanden." }, { status: 404 });
|
|
}
|
|
|
|
try {
|
|
const absolutePath = resolveLogoPath(settings.path);
|
|
const file = await fs.readFile(absolutePath);
|
|
return new NextResponse(file, {
|
|
headers: {
|
|
"Content-Type": settings.type,
|
|
"Cache-Control": "no-store"
|
|
}
|
|
});
|
|
} catch {
|
|
return NextResponse.json({ error: "Logo konnte nicht geladen werden." }, { status: 404 });
|
|
}
|
|
}
|
|
|
|
export async function HEAD() {
|
|
const settings = await getLogoSettings();
|
|
if (!settings) {
|
|
return new NextResponse(null, { status: 404 });
|
|
}
|
|
|
|
return new NextResponse(null, {
|
|
status: 200,
|
|
headers: {
|
|
"Content-Type": settings.type,
|
|
"Cache-Control": "no-store"
|
|
}
|
|
});
|
|
}
|