From 6ca1e032a64ccebb9cf7fa3e74c116ea528921b5 Mon Sep 17 00:00:00 2001 From: nico Date: Wed, 21 Jan 2026 14:09:27 +0800 Subject: [PATCH] Fix uploads -1 --- bun.lockb | Bin 423223 -> 424350 bytes package.json | 2 + prisma/seed_assets.ts | 381 ++++++++++++++++++++++-------- src/app/api/[[...slugs]]/route.ts | 26 +- 4 files changed, 303 insertions(+), 106 deletions(-) diff --git a/bun.lockb b/bun.lockb index e30c097613d9bfed2a8bed26cfd8cb0c3e5e8a2d..14f3d9e9c553e8c6ef5d3af125a851b747a3e886 100755 GIT binary patch delta 76110 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 diff --git a/package.json b/package.json index e4b3bc0b..cfab3f92 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@types/bun": "^1.2.2", "@types/leaflet": "^1.9.20", "@types/lodash": "^4.17.16", + "@types/mime-types": "^3.0.1", "@types/nodemailer": "^7.0.2", "add": "^2.0.6", "adm-zip": "^0.5.16", @@ -72,6 +73,7 @@ "leaflet": "^1.9.4", "list": "^2.0.19", "lodash": "^4.17.21", + "mime-types": "^3.0.2", "motion": "^12.4.1", "nanoid": "^5.1.5", "next": "^15.5.2", diff --git a/prisma/seed_assets.ts b/prisma/seed_assets.ts index 5b086254..79e72337 100644 --- a/prisma/seed_assets.ts +++ b/prisma/seed_assets.ts @@ -1,27 +1,222 @@ -/* eslint-disable @typescript-eslint/no-unused-vars */ +// /* eslint-disable @typescript-eslint/no-unused-vars */ +// // prisma/seedAssets.ts +// import prisma from "@/lib/prisma"; +// import AdmZip from "adm-zip"; +// import fs from "fs/promises"; +// import path from "path"; +// import sharp from "sharp"; +// import fetchWithRetry from "./data/fetchWithRetry"; + +// const UPLOADS_DIR = path.resolve( +// process.env.WIBU_UPLOAD_DIR || "uploads" +// ); + +// // --- Helper: deteksi kategori file --- +// function detectCategory(filename: string): "image" | "document" | "other" { +// const ext = path.extname(filename).toLowerCase(); +// if ([".jpg", ".jpeg", ".png", ".webp"].includes(ext)) return "image"; +// if ([".pdf", ".doc", ".docx"].includes(ext)) return "document"; +// return "other"; +// } + +// // --- Helper: recursive walk dir --- +// async function walkDir( +// dir: string, +// fileList: string[] = [] +// ): Promise { +// const entries = await fs.readdir(dir, { withFileTypes: true }); + +// for (const entry of entries) { +// const fullPath = path.join(dir, entry.name); + +// if (entry.isDirectory()) { +// if (entry.name === "__MACOSX") continue; // skip folder sampah +// await walkDir(fullPath, fileList); +// } else { +// if (entry.name.startsWith(".") || entry.name === ".DS_Store") continue; // skip file sampah +// fileList.push(fullPath); +// } +// } + +// return fileList; +// } + +// export default async function seedAssets() { +// console.log("🚀 Seeding assets..."); +// console.log("📁 Upload dir:", UPLOADS_DIR); + +// await fs.mkdir(UPLOADS_DIR, { recursive: true }); + +// // 1. Download zip +// const url = +// "https://cld-dkr-makuro-seafile.wibudev.com/f/eadd52c5bd654ec789a3/?dl=1"; +// const res = await fetchWithRetry(url, 3, 20000); + +// // Validasi content-type +// const contentType = res.headers.get("content-type"); +// if (!contentType?.includes("zip")) { +// throw new Error(`Invalid content-type (${contentType}). Expected ZIP file`); +// } + +// const buffer = Buffer.from(await res.arrayBuffer()); + +// // Validasi ukuran file +// if (buffer.length < 100) { +// throw new Error("Downloaded ZIP is empty or corrupted"); +// } + +// // Validasi signature ZIP ("PK") +// if (buffer.toString("utf8", 0, 2) !== "PK") { +// throw new Error("Invalid ZIP signature (PK not found)"); +// } + +// // 2. Extract zip ke folder tmp +// const extractDir = path.join(process.cwd(), "tmp_assets"); +// await fs.rm(extractDir, { recursive: true, force: true }); +// await fs.mkdir(extractDir, { recursive: true }); + +// let zip: AdmZip; + +// try { +// zip = new AdmZip(buffer); +// } catch (err) { +// throw new Error("Failed to parse ZIP file (corrupted or invalid)"); +// } + +// try { +// zip.extractAllTo(extractDir, true); +// } catch (err) { +// throw new Error("Failed to extract ZIP contents"); +// } + +// // 3. Cari semua file valid (recursive) +// const files = await walkDir(extractDir); + +// // 4. Loop tiap file & simpan +// for (const filePath of files) { +// const entryName = path.basename(filePath); +// const category = detectCategory(entryName); + +// let finalName = entryName; +// let mimeType = "application/octet-stream"; +// let targetPath = ""; + +// if (category === "image") { +// const fileBaseName = path.parse(entryName).name; +// finalName = `${fileBaseName}.webp`; +// targetPath = path.join(UPLOADS_DIR, "images", finalName); +// await fs.mkdir(path.dirname(targetPath), { recursive: true }); +// await sharp(filePath).webp({ quality: 80 }).toFile(targetPath); +// mimeType = "image/webp"; +// } else if (category === "document") { +// targetPath = path.join(UPLOADS_DIR, "documents", entryName); +// await fs.mkdir(path.dirname(targetPath), { recursive: true }); +// await fs.copyFile(filePath, targetPath); +// mimeType = "application/pdf"; +// } else { +// targetPath = path.join(UPLOADS_DIR, "other", entryName); +// await fs.mkdir(path.dirname(targetPath), { recursive: true }); +// await fs.copyFile(filePath, targetPath); +// } + +// const existing = await prisma.fileStorage.findUnique({ +// where: { name: finalName }, +// }); + +// if (existing) { +// // Restore kalau soft deleted +// await prisma.fileStorage.update({ +// where: { name: finalName }, +// data: { +// path: targetPath, +// realName: entryName, +// mimeType, +// link: `/uploads/${category}/${finalName}`, +// category, +// deletedAt: null, +// isActive: true, +// }, +// }); + +// console.log(`♻️ restored: ${category}/${finalName}`); +// } else { +// await prisma.fileStorage.create({ +// data: { +// name: finalName, +// realName: entryName, +// path: targetPath, +// mimeType, +// link: `/uploads/${category}/${finalName}`, +// category, +// }, +// }); + +// console.log(`📂 created: ${category}/${finalName}`); +// } + +// console.log(`📂 saved: ${category}/${finalName}`); +// } + +// // 6. Cleanup +// await fs.rm(extractDir, { recursive: true, force: true }); + +// console.log("✅ Selesai seed assets!"); +// console.log("DB URL (asset):", process.env.DATABASE_URL); + +// } + +// // --- Auto run kalau dipanggil langsung --- +// if (import.meta.main) { +// seedAssets() +// .catch((err) => { +// console.error("❌ Error seeding assets:", err); +// process.exit(1); +// }) +// .finally(async () => { +// await prisma.$disconnect(); +// }); +// } + + // prisma/seedAssets.ts import prisma from "@/lib/prisma"; import AdmZip from "adm-zip"; import fs from "fs/promises"; import path from "path"; import sharp from "sharp"; +import mime from "mime-types"; import fetchWithRetry from "./data/fetchWithRetry"; -const UPLOADS_DIR = - process.env.WIBU_UPLOAD_DIR || path.join(process.cwd(), "uploads"); +/* ========================= + * CONFIG + * ========================= */ +const UPLOADS_DIR = path.resolve( + process.env.WIBU_UPLOAD_DIR || "uploads" +); -// --- Helper: deteksi kategori file --- -function detectCategory(filename: string): "image" | "document" | "other" { +const TMP_DIR = path.join(process.cwd(), "tmp_assets"); + +const CATEGORY_DIR: Record = { + image: "images", + document: "documents", + other: "other", +}; + +type FileCategory = "image" | "document" | "other"; + +/* ========================= + * HELPERS + * ========================= */ +function detectCategory(filename: string): FileCategory { const ext = path.extname(filename).toLowerCase(); if ([".jpg", ".jpeg", ".png", ".webp"].includes(ext)) return "image"; - if ([".pdf", ".doc", ".docx"].includes(ext)) return "document"; + if ([".pdf", ".doc", ".docx", ".txt"].includes(ext)) return "document"; return "other"; } -// --- Helper: recursive walk dir --- async function walkDir( dir: string, - fileList: string[] = [] + result: string[] = [] ): Promise { const entries = await fs.readdir(dir, { withFileTypes: true }); @@ -29,139 +224,139 @@ async function walkDir( const fullPath = path.join(dir, entry.name); if (entry.isDirectory()) { - if (entry.name === "__MACOSX") continue; // skip folder sampah - await walkDir(fullPath, fileList); + if (entry.name === "__MACOSX") continue; + await walkDir(fullPath, result); } else { - if (entry.name.startsWith(".") || entry.name === ".DS_Store") continue; // skip file sampah - fileList.push(fullPath); + if (entry.name.startsWith(".") || entry.name === ".DS_Store") continue; + result.push(fullPath); } } - return fileList; + return result; } +async function ensureDir(dir: string) { + await fs.mkdir(dir, { recursive: true }); +} + +/* ========================= + * FILE PROCESSORS + * ========================= */ +async function processImage(filePath: string, entryName: string) { + const baseName = path.parse(entryName).name; + const finalName = `${baseName}.webp`; + const targetDir = path.join(UPLOADS_DIR, CATEGORY_DIR.image); + const targetPath = path.join(targetDir, finalName); + + await ensureDir(targetDir); + await sharp(filePath).webp({ quality: 80 }).toFile(targetPath); + + return { + finalName, + targetPath, + mimeType: "image/webp", + }; +} + +async function processNonImage( + filePath: string, + entryName: string, + category: FileCategory +) { + const targetDir = path.join(UPLOADS_DIR, CATEGORY_DIR[category]); + const targetPath = path.join(targetDir, entryName); + + await ensureDir(targetDir); + await fs.copyFile(filePath, targetPath); + + return { + finalName: entryName, + targetPath, + mimeType: mime.lookup(entryName) || "application/octet-stream", + }; +} + +/* ========================= + * MAIN + * ========================= */ export default async function seedAssets() { console.log("🚀 Seeding assets..."); + console.log("📁 Upload dir:", UPLOADS_DIR); - // 1. Download zip + await ensureDir(UPLOADS_DIR); + + /* ===== Download ZIP ===== */ const url = "https://cld-dkr-makuro-seafile.wibudev.com/f/eadd52c5bd654ec789a3/?dl=1"; const res = await fetchWithRetry(url, 3, 20000); - // Validasi content-type - const contentType = res.headers.get("content-type"); - if (!contentType?.includes("zip")) { - throw new Error(`Invalid content-type (${contentType}). Expected ZIP file`); + if (!res.headers.get("content-type")?.includes("zip")) { + throw new Error("Invalid ZIP content-type"); } const buffer = Buffer.from(await res.arrayBuffer()); - - // Validasi ukuran file - if (buffer.length < 100) { - throw new Error("Downloaded ZIP is empty or corrupted"); + if (buffer.length < 100 || buffer.toString("utf8", 0, 2) !== "PK") { + throw new Error("Corrupted ZIP file"); } - // Validasi signature ZIP ("PK") - if (buffer.toString("utf8", 0, 2) !== "PK") { - throw new Error("Invalid ZIP signature (PK not found)"); - } + /* ===== Extract ===== */ + await fs.rm(TMP_DIR, { recursive: true, force: true }); + await ensureDir(TMP_DIR); - // 2. Extract zip ke folder tmp - const extractDir = path.join(process.cwd(), "tmp_assets"); - await fs.rm(extractDir, { recursive: true, force: true }); - await fs.mkdir(extractDir, { recursive: true }); + const zip = new AdmZip(buffer); + zip.extractAllTo(TMP_DIR, true); - let zip: AdmZip; + /* ===== Process Files ===== */ + const files = await walkDir(TMP_DIR); - try { - zip = new AdmZip(buffer); - } catch (err) { - throw new Error("Failed to parse ZIP file (corrupted or invalid)"); - } - - try { - zip.extractAllTo(extractDir, true); - } catch (err) { - throw new Error("Failed to extract ZIP contents"); - } - - // 3. Cari semua file valid (recursive) - const files = await walkDir(extractDir); - - // 4. Loop tiap file & simpan for (const filePath of files) { const entryName = path.basename(filePath); const category = detectCategory(entryName); - let finalName = entryName; - let mimeType = "application/octet-stream"; - let targetPath = ""; + let result; if (category === "image") { - const fileBaseName = path.parse(entryName).name; - finalName = `${fileBaseName}.webp`; - targetPath = path.join(UPLOADS_DIR, "images", finalName); - await fs.mkdir(path.dirname(targetPath), { recursive: true }); - await sharp(filePath).webp({ quality: 80 }).toFile(targetPath); - mimeType = "image/webp"; - } else if (category === "document") { - targetPath = path.join(UPLOADS_DIR, "documents", entryName); - await fs.mkdir(path.dirname(targetPath), { recursive: true }); - await fs.copyFile(filePath, targetPath); - mimeType = "application/pdf"; + result = await processImage(filePath, entryName); } else { - targetPath = path.join(UPLOADS_DIR, "other", entryName); - await fs.mkdir(path.dirname(targetPath), { recursive: true }); - await fs.copyFile(filePath, targetPath); + result = await processNonImage(filePath, entryName, category); } + const { finalName, targetPath, mimeType } = result; + const existing = await prisma.fileStorage.findUnique({ where: { name: finalName }, }); + const data = { + name: finalName, + realName: entryName, + path: targetPath, + mimeType, + link: `/uploads/${CATEGORY_DIR[category]}/${finalName}`, + category, + deletedAt: null, + isActive: true, + }; + if (existing) { - // Restore kalau soft deleted await prisma.fileStorage.update({ where: { name: finalName }, - data: { - path: targetPath, - realName: entryName, - mimeType, - link: `/uploads/${category}/${finalName}`, - category, - deletedAt: null, - isActive: true, - }, + data, }); - console.log(`♻️ restored: ${category}/${finalName}`); } else { - await prisma.fileStorage.create({ - data: { - name: finalName, - realName: entryName, - path: targetPath, - mimeType, - link: `/uploads/${category}/${finalName}`, - category, - }, - }); - + await prisma.fileStorage.create({ data }); console.log(`📂 created: ${category}/${finalName}`); } - - console.log(`📂 saved: ${category}/${finalName}`); } - // 6. Cleanup - await fs.rm(extractDir, { recursive: true, force: true }); + /* ===== Cleanup ===== */ + await fs.rm(TMP_DIR, { recursive: true, force: true }); console.log("✅ Selesai seed assets!"); - console.log("DB URL (asset):", process.env.DATABASE_URL); - } -// --- Auto run kalau dipanggil langsung --- +/* ===== Auto Run ===== */ if (import.meta.main) { seedAssets() .catch((err) => { diff --git a/src/app/api/[[...slugs]]/route.ts b/src/app/api/[[...slugs]]/route.ts index ed4e2f1b..22580aec 100644 --- a/src/app/api/[[...slugs]]/route.ts +++ b/src/app/api/[[...slugs]]/route.ts @@ -65,7 +65,7 @@ const Utils = new Elysia({ }).get("/version", async () => { const packageJson = await fs.readFile( path.join(ROOT, "package.json"), - "utf-8" + "utf-8", ); const version = JSON.parse(packageJson).version; return { version }; @@ -78,9 +78,9 @@ const ApiServer = new Elysia() .use(swagger({ path: "/api/docs" })) .use( staticPlugin({ - assets: process.env.WIBU_UPLOAD_DIR, + assets: UPLOAD_DIR, prefix: "/uploads", - }) + }), ) .use(cors(corsConfig)) .use(Utils) @@ -127,9 +127,9 @@ const ApiServer = new Elysia() query: t.Optional( t.Object({ size: t.Optional(t.Number()), - }) + }), ), - } + }, ) .delete( "/img/:name", @@ -143,7 +143,7 @@ const ApiServer = new Elysia() params: t.Object({ name: t.String(), }), - } + }, ) .get( "/imgs", @@ -161,9 +161,9 @@ const ApiServer = new Elysia() page: t.Number({ default: 1 }), count: t.Number({ default: 10 }), search: t.String({ default: "" }), - }) + }), ), - } + }, ) .post( "/upl-img", @@ -176,7 +176,7 @@ const ApiServer = new Elysia() title: t.String(), files: t.Files({ multiple: true }), }), - } + }, ) .post( "/upl-img-single", @@ -192,7 +192,7 @@ const ApiServer = new Elysia() name: t.String(), file: t.File(), }), - } + }, ) .post( "/upl-csv-single", @@ -204,7 +204,7 @@ const ApiServer = new Elysia() name: t.String(), file: t.File(), }), - } + }, ) .post( "/upl-csv", @@ -215,8 +215,8 @@ const ApiServer = new Elysia() body: t.Object({ files: t.Files(), }), - } - ) + }, + ), ); export const GET = ApiServer.handle;