diff --git a/public/assets/images/media/logo-1783091166418-npn577.gif b/public/assets/images/media/logo-1783091166418-npn577.gif
new file mode 100644
index 0000000000..d995749ff3
Binary files /dev/null and b/public/assets/images/media/logo-1783091166418-npn577.gif differ
diff --git a/src/actions/save-logo.ts b/src/actions/save-logo.ts
index 830173938a..7686310254 100644
--- a/src/actions/save-logo.ts
+++ b/src/actions/save-logo.ts
@@ -1,12 +1,12 @@
"use server";
import { revalidatePath } from "next/cache";
-import { writeFile } from "fs/promises";
+import { mkdir, writeFile } from "fs/promises";
import path from "path";
import { prisma } from "@/lib/prisma";
import { siteSettings } from "@/lib/services/site-settings";
-const MEDIA_DIR = "public/assets/images/media";
+const MEDIA_DIR = "public/assets/images/media/logo";
export async function saveLogo(formData: FormData): Promise<{ success: boolean; url?: string; error?: string }> {
try {
@@ -20,9 +20,10 @@ export async function saveLogo(formData: FormData): Promise<{ success: boolean;
const filePath = path.join(dir, filename);
const buffer = Buffer.from(await file.arrayBuffer());
+ await mkdir(dir, { recursive: true });
await writeFile(filePath, buffer);
- const url = `/api/media/${filename}`;
+ const url = `/api/media/logo/${filename}`;
await prisma.websiteSetting.upsert({
where: { key: "cms_logo" },
@@ -53,9 +54,10 @@ export async function saveLogoFromUrl(gifUrl: string): Promise<{ success: boolea
const dir = path.join(process.cwd(), MEDIA_DIR);
const filePath = path.join(dir, filename);
+ await mkdir(dir, { recursive: true });
await writeFile(filePath, buffer);
- const url = `/api/media/${filename}`;
+ const url = `/api/media/logo/${filename}`;
await prisma.websiteSetting.upsert({
where: { key: "cms_logo" },
diff --git a/src/app/api/media/[name]/route.ts b/src/app/api/media/[...path]/route.ts
similarity index 86%
rename from src/app/api/media/[name]/route.ts
rename to src/app/api/media/[...path]/route.ts
index 29a592c993..4fba7460bf 100644
--- a/src/app/api/media/[name]/route.ts
+++ b/src/app/api/media/[...path]/route.ts
@@ -10,11 +10,12 @@ const ALLOWED_EXT = [".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg", ".bmp"];
export async function GET(
_request: Request,
- { params }: { params: Promise<{ name: string }> },
+ { params }: { params: Promise<{ path: string[] }> },
) {
- const { name } = await params;
+ const { path: segments } = await params;
+ const name = segments.join("/");
// Prevent path traversal
- if (name.includes("..") || name.includes("/") || name.includes("\\")) {
+ if (name.includes("..") || name.includes("\\")) {
return new NextResponse("Forbidden", { status: 403 });
}
const ext = path.extname(name).toLowerCase();
diff --git a/src/components/top-header.tsx b/src/components/top-header.tsx
index 52746cb5cc..1f16abdd8a 100644
--- a/src/components/top-header.tsx
+++ b/src/components/top-header.tsx
@@ -76,10 +76,13 @@ export async function TopHeader() {
Commandocentrum
-
- Logs
-
-
+
+ Logs
+
+
+ Logo generator
+
+
) : null}