diff --git a/.gitignore b/.gitignore index a82de76..e30b04f 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,5 @@ next-env.d.ts /public/file/ certificates -test.png \ No newline at end of file +test.png +test2.png \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index d7534ce..803247d 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/package.json b/package.json index 888b6fa..aac4e7b 100644 --- a/package.json +++ b/package.json @@ -39,18 +39,24 @@ "@tiptap/pm": "^2.11.7", "@tiptap/react": "^2.4.0", "@tiptap/starter-kit": "^2.4.0", + "@types/busboy": "^1.5.4", "@types/lodash": "^4.17.6", + "@types/multer": "^1.4.12", "@types/web-push": "^3.6.3", + "busboy": "^1.6.0", "dayjs": "^1.11.11", "echarts": "^5.5.1", "echarts-for-react": "^3.0.2", "elysia": "^1.3.1", "embla-carousel-autoplay": "^7.1.0", "embla-carousel-react": "^7.1.0", + "from": "^0.1.7", + "import": "^0.0.6", "iron-session": "^8.0.2", "jose": "^5.9.2", "lodash": "^4.17.21", "moment": "^2.30.1", + "multer": "^1.4.5-lts.2", "next": "14.2.4", "pdfjs-dist": "^4.6.82", "prettier": "^3.3.2", diff --git a/src/app/api/v2/[[...slug]]/route.ts b/src/app/api/v2/[[...slug]]/route.ts index 2274ed5..2cfcbb7 100644 --- a/src/app/api/v2/[[...slug]]/route.ts +++ b/src/app/api/v2/[[...slug]]/route.ts @@ -1,51 +1,36 @@ -import Elysia from "elysia"; -import { swagger } from "@elysiajs/swagger"; -import { t } from "elysia"; -import fs from "fs/promises"; import cors from "@elysiajs/cors"; -const Api = new Elysia({ - prefix: "/api/v2" -}) - .onError((c) => { - console.log(c) - return c - }) - // send a file - .post("/test", async (c) => { - try { - // const { file } = c.body +import { swagger } from "@elysiajs/swagger"; +import Elysia from "elysia"; +import { existsSync } from "fs"; +import fs from "fs/promises"; +const UPLOAD_DIR = "./uploads"; - console.log("terima file") - // const buffer = Buffer.from(await file.arrayBuffer()); - // await fs.writeFile("./test.png", buffer); - - return { - success: true, - message: "File uploaded successfully", - } - } catch (error) { - console.error(JSON.stringify(error)); - return { - success: false, - message: "File uploaded failed", - } - } - }, { - body: t.Object({ - name: t.String(), - file: t.File(), - }), +const Api = new Elysia({ prefix: "/api/v2" }) + .onError(({ error }) => { + }) + .post("/test", async ({ request }) => { + const formData = await request.formData() + const file = formData.get("file") as File; + const buffer = Buffer.from(await file.arrayBuffer()); + await fs.writeFile("./test2.png", buffer); + + return { + status: "success", + message: "File uploaded successfully", + data: { + } + }; + + }); const ApiServer = new Elysia() .use(cors({ origin: "*", - methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"], + methods: ["GET", "POST", "PUT", "DELETE", "OPTIONS"] })) - .use(swagger({ - path: "/api/v2/docs" - })) - .use(Api) + .use(swagger({ path: "/api/v2/docs" })) + .use(Api); -export const GET = ApiServer.handle -export const POST = ApiServer.handle \ No newline at end of file +export const GET = ApiServer.handle; +export const POST = ApiServer.handle; diff --git a/src/app/api/v2/uploads/route.ts b/src/app/api/v2/uploads/route.ts new file mode 100644 index 0000000..2572f86 --- /dev/null +++ b/src/app/api/v2/uploads/route.ts @@ -0,0 +1,67 @@ +// app/api/upload/route.ts +import { NextRequest } from 'next/server'; + +// Since using Multer directly is difficult with Next.js App Router, +// we'll create a custom implementation using busboy which multer uses internally + +export async function POST(request: NextRequest) { + try { + // Check content type + const contentType = request.headers.get('content-type') || ''; + if (!contentType.includes('multipart/form-data')) { + return new Response(JSON.stringify({ error: 'Invalid content-type' }), { + status: 400, + headers: { 'Content-Type': 'application/json' }, + }); + } + + // Use formData directly instead of trying to make multer work + // This is the recommended approach for Next.js App Router + const formData = await request.formData(); + const file = formData.get('file') as File; + + if (!file) { + return new Response(JSON.stringify({ error: 'No file uploaded' }), { + status: 400, + headers: { 'Content-Type': 'application/json' }, + }); + } + + const bytes = await file.arrayBuffer(); + const buffer = Buffer.from(bytes); + + // Here you can add file validation, processing, or storage + // similar to what multer would do + + // Example: check file type or size + if (buffer.length > 5 * 1024 * 1024) { // 5MB limit + return new Response(JSON.stringify({ error: 'File too large' }), { + status: 400, + headers: { 'Content-Type': 'application/json' }, + }); + } + + // Example: you can save the file to disk or cloud storage here + // const fs = require('fs'); + // fs.writeFileSync(`./uploads/${file.name}`, buffer); + + return new Response( + JSON.stringify({ + message: 'Upload successful', + name: file.name, + type: file.type, + size: buffer.length, + }), + { + status: 200, + headers: { 'Content-Type': 'application/json' }, + } + ); + } catch (err: any) { + console.error('Upload error:', err); + return new Response(JSON.stringify({ error: err.message }), { + status: 500, + headers: { 'Content-Type': 'application/json' }, + }); + } +} \ No newline at end of file