"use server"; import { mkdir, writeFile } from "node:fs/promises"; import path from "node:path"; import { revalidatePath } from "next/cache"; import { prisma } from "@/lib/prisma"; import { siteSettings } from "@/lib/services/site-settings"; const MEDIA_DIR = "public/assets/images/media/logo"; export async function saveLogo( formData: FormData, ): Promise<{ success: boolean; url?: string; error?: string }> { try { const file = formData.get("file") as File | null; if (!file) return { success: false, error: "No file provided" }; const ext = file.type === "image/png" ? "png" : file.type === "image/gif" ? "gif" : file.type === "image/jpeg" ? "jpg" : file.type === "image/webp" ? "webp" : "png"; const filename = `logo-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.${ext}`; const baseDir = path.resolve(process.cwd(), MEDIA_DIR); const filePath = path.resolve(baseDir, filename); if (!filePath.startsWith(baseDir + path.sep)) { return { success: false, error: "Invalid path" }; } const buffer = Buffer.from(await file.arrayBuffer()); // eslint-disable-next-line security/detect-non-literal-fs-filename await mkdir(baseDir, { recursive: true }); // eslint-disable-next-line security/detect-non-literal-fs-filename await writeFile(filePath, buffer); const url = `/api/media/logo/${filename}`; await prisma.websiteSetting.upsert({ where: { key: "cms_logo" }, update: { value: url }, create: { key: "cms_logo", value: url, comment: "Logo (generator)" }, }); siteSettings.reload(); revalidatePath("/", "layout"); return { success: true, url }; } catch (e) { return { success: false, error: e instanceof Error ? e.message : "Unknown error", }; } } export async function saveLogoFromUrl( gifUrl: string, ): Promise<{ success: boolean; url?: string; error?: string }> { try { const res = await fetch(gifUrl); if (!res.ok) return { success: false, error: `Failed to fetch GIF: ${res.status}` }; const contentType = res.headers.get("content-type") ?? "image/gif"; const buffer = Buffer.from(await res.arrayBuffer()); const ext = contentType === "image/png" ? "png" : contentType === "image/gif" ? "gif" : contentType === "image/jpeg" ? "jpg" : contentType === "image/webp" ? "webp" : "gif"; const filename = `logo-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.${ext}`; const baseDir = path.resolve(process.cwd(), MEDIA_DIR); const filePath = path.resolve(baseDir, filename); if (!filePath.startsWith(baseDir + path.sep)) { return { success: false, error: "Invalid path" }; } // eslint-disable-next-line security/detect-non-literal-fs-filename await mkdir(baseDir, { recursive: true }); // eslint-disable-next-line security/detect-non-literal-fs-filename await writeFile(filePath, buffer); const url = `/api/media/logo/${filename}`; await prisma.websiteSetting.upsert({ where: { key: "cms_logo" }, update: { value: url }, create: { key: "cms_logo", value: url, comment: "Logo (generator)" }, }); siteSettings.reload(); revalidatePath("/", "layout"); return { success: true, url }; } catch (e) { return { success: false, error: e instanceof Error ? e.message : "Unknown error", }; } }