Utils/FileUploadHandler.js

/**Copyright (c) 2009-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.**/
"use strict";const InternalServerError=require("../Errors/InternalServerError"),InvalidInputError=require("../Errors/InvalidInputError"),BadRequestError=require("../Errors/BadRequestError"),multer=require("multer"),path=require("path");
/** 
 * Class which defines FileUploadHandler
 * @memberof mdxWebApiCore.Utils
 * */
class FileUploadHandler{
/**
      * handles errors which occur during file upload
      * @public
      * @static
      * @param {Error} error
      * @param {Array<{name:string, maxCount:number, validFileExtensions: Set<string>}>} formFields
      * @example
      * const mdx = require("@nvidia-mdx/web-api-core");
      * mdx.Utils.FileUploadHandler.errorHandler(error,formFields);
     */
static errorHandler(e,r){if(e instanceof InvalidInputError)throw e;if(e instanceof multer.MulterError){if("Too many files"===e.message){let e=`Too many files have been uploaded. Following are the limits- ${r.map((e=>`${e.name}: ${e.maxCount}`)).join(", ")}.`;throw new BadRequestError(e)}throw console.error(e),new BadRequestError(e.message)}throw new InternalServerError(e.message)}
/**
      * returns modified file name 
      * @public
      * @static
      * @param {string} originalFileName
      * @returns {string} - Modified file name is returned
      * @example
      * const mdx = require("@nvidia-mdx/web-api-core");
      * let modifiedFileName = mdx.Utils.FileUploadHandler.getModifiedFileName("abc.png");
      */static getModifiedFileName(e){const r=`${Date.now()} - ${Math.round(1e9*Math.random())}`;let n=path.extname(e).toLowerCase(),a=e.split(n);return a.pop(),`${a.join(n)} - ${r}${n}`}
/**
      * returns the result of Multer.fields which is used to obtain the uploaded files
      * @public
      * @static
      * @param {Array<{name:string, maxCount:number, validFileExtensions: Set<string>}>} formFields
      * @param {string} fileUploadLocation
      * @param {boolean} [modifyFileName=true]
      * @returns {Object} Result of Multer.fields is returned
      */static getMulterUpload(e,r,n=!0){const a=new Array,t=new Map;for(let r of e)a.push({name:r.name,maxCount:r.maxCount}),r.hasOwnProperty("validFileExtensions")&&t.set(r.name,r.validFileExtensions);const o=multer.diskStorage({destination:(e,n,a)=>{a(null,r)},filename:(e,r,a)=>{a(null,n?FileUploadHandler.getModifiedFileName(r.originalname):r.originalname)}});return multer({storage:o,fileFilter:(e,r,n)=>{let a=r.fieldname;if(t.has(a)){const e=t.get(a);let o=path.extname(r.originalname).toLowerCase();if(!e.has(o)){let a=`Invalid file: ${r.originalname}. Only files with following extensions are allowed: ${Array.from(e).join(", ")}.`;return n(new InvalidInputError(a),!1)}}n(null,!0)}}).fields(a)}}module.exports=FileUploadHandler;