From 423931c8650f2a34425557695c3b9756c88e542e Mon Sep 17 00:00:00 2001 From: mbaharip <62494292+mbahArip@users.noreply.github.com> Date: Tue, 23 May 2023 03:29:13 +0700 Subject: [PATCH] Add disable limit for maxFileSize --- src/app/(api)/api/banner/route.ts | 3 +- src/app/download/[...path]/route.ts | 142 ---------------------------- src/config/api.config.js | 1 + 3 files changed, 3 insertions(+), 143 deletions(-) delete mode 100644 src/app/download/[...path]/route.ts diff --git a/src/app/(api)/api/banner/route.ts b/src/app/(api)/api/banner/route.ts index b3a238b..9a872da 100644 --- a/src/app/(api)/api/banner/route.ts +++ b/src/app/(api)/api/banner/route.ts @@ -50,7 +50,8 @@ export async function GET(request: NextRequest) { if ( Number(metadata.data.size) > - apiConfig.files.download.maxFileSize + apiConfig.files.download.maxFileSize && + apiConfig.files.download.maxFileSize > 0 ) { return NextResponse.redirect( metadata.data.webContentLink as string, diff --git a/src/app/download/[...path]/route.ts b/src/app/download/[...path]/route.ts deleted file mode 100644 index f47ca13..0000000 --- a/src/app/download/[...path]/route.ts +++ /dev/null @@ -1,142 +0,0 @@ -import { ErrorResponse } from "types/googleapis"; -import { NextRequest, NextResponse } from "next/server"; -import driveClient from "utils/driveClient"; -import apiConfig from "config/api.config"; -import { ExtendedError } from "utils/driveHelper"; -import axios from "axios"; - -export async function GET( - request: NextRequest, - { params }: { params: { path: string[] } }, -) { - const _start = Date.now(); - - try { - const validatePath = await axios.get( - `${ - apiConfig.basePath - }/api/validatePath?path=${params.path.join("/")}`, - ); - - return NextResponse.json( - { data: validatePath.data }, - { status: 200 }, - ); - - let id = ""; - // const id = shortDecrypt(params.encryptedId); - // const { token } = getSearchParams(request.url, [ - // "token", - // ]); - // - // if (!apiConfig.files.download.allowProtectedFile) { - // const decryptToken = shortDecrypt(token ? token : ""); - // const parsedToken = JSON.parse( - // decryptToken || "{}", - // ) as DownloadToken; - // if (!parsedToken) { - // throw new ExtendedError( - // "Protected file not allowed.", - // 403, - // "forbidden", - // ); - // } - // } - - const getMetadata = driveClient.files.get({ - fileId: id, - fields: apiConfig.files.field, - }); - const getStream = driveClient.files.get( - { - fileId: id, - alt: "media", - }, - { responseType: "stream" }, - ); - - const [metadata, stream] = await Promise.all([ - getMetadata, - getStream, - ]); - - if (!metadata || metadata.data.trashed) { - const msg = metadata.data.trashed - ? "File has been deleted" - : "File not found"; - throw new ExtendedError(msg, 404, "notFound"); - } - - if ( - metadata.data.mimeType === - "application/vnd.google-apps.folder" - ) { - throw new ExtendedError( - "Can't download folder", - 400, - "badRequest", - ); - } - if ( - Number(metadata.data.size) > - apiConfig.files.download.maxFileSize - ) { - return NextResponse.redirect( - metadata.data.webContentLink as string, - { status: 302 }, - ); - } - - const arrayBuffer = await new Promise( - (resolve, reject) => { - const chunks: Buffer[] = []; - stream.data.on("data", (chunk) => - chunks.push(chunk), - ); - stream.data.on("end", () => { - const buffer = Buffer.concat(chunks); - resolve( - buffer.buffer.slice( - buffer.byteOffset, - buffer.byteOffset + buffer.byteLength, - ), - ); - }); - stream.data.on("error", reject); - }, - ); - - return new NextResponse(arrayBuffer, { - status: 200, - headers: { - "Content-Type": - metadata.data.mimeType || - "application/octet-stream", - "Cache-Control": - "public, max-age=31536000, immutable", - "Content-Disposition": `inline; filename="${metadata.data.name}"`, - }, - }); - } catch (error: any) { - const payload: ErrorResponse = { - success: false, - timestamp: new Date().toISOString(), - responseTime: Date.now() - _start, - code: error.code || 500, - errors: { - message: - error.errors?.[0].message || - error.message || - "Unknown error", - reason: - error.errors?.[0].reason || - error.cause || - "internalError", - }, - }; - - return NextResponse.json(payload, { - status: payload.code || 500, - }); - } -} diff --git a/src/config/api.config.js b/src/config/api.config.js index 7254b27..c0a6f95 100644 --- a/src/config/api.config.js +++ b/src/config/api.config.js @@ -60,6 +60,7 @@ module.exports = { * https://vercel.com/docs/platform/limits#serverless-function-payload-size-limit * If you're using another platform that has different limit, * change this value to match your platform. + * Set to 0 to disable limit */ maxFileSize: 4 * 1024 * 1024, },