admin/modules/multer.js

/* ============================================================================ *\
|| ########################################################################## ||
|| # Auction Software Marketplace          Release: 0.6   Build 0.7         # ||
|| # ---------------------------------------------------------------------- # ||
|| # License # 35YAHCNR9344X6O666C123AB                                     # ||
|| # ---------------------------------------------------------------------- # ||
|| # Copyright ©2014–2021 Develop Scripts LLC. All Rights Reserved          # ||
|| # This file may not be redistributed in whole or significant part.       # ||
|| # ------------- AUCTION SOFTWARE IS NOT FREE SOFTWARE ------------------ # ||
|| # http://www.auctionsoftwaremarketplace.com|support@auctionsoftware.com  # ||
|| # ---------------------------------------------------------------------- # ||
|| ########################################################################## ||
\* ============================================================================ */

/* eslint-disable consistent-return */
/* eslint-disable class-methods-use-this */
const multer = require('multer')
const mime = require('mime')
/**
 * @class class to handle product functions
 */
class multerModule {
    constructor() {
        this.folder = ''
        this.filter = ''
        this.storage = ''
    }
    /**
     * csvFilter
     * @param {req} req request data
     * @param {string} file file data
     * @param {Function} cb call back function
     */
    csvFilter(req, file, cb) {
        // accept csv only
        const fileext = mime.getExtension(file.mimetype)
        if (fileext === 'csv' || fileext === 'xls' || fileext === 'xlsx') {
            cb(null, true)
        } else {
            req.fileValidationError = 'Forbidden extension'
            cb(null, false, req.fileValidationError)
        }
    }
    /**
     * imageFilter
     * @param {req} req request data
     * @param {string} file file data
     * @param {Function} cb call back function
     */
    imageFilter(req, file, cb) {
        // accept image only
        if (!file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
            return cb(new Error('Only image files are allowed!'), false)
        }
        cb(null, true)
    }

    noFilter(req, file, cb) {
        cb(null, true)
    }
    /**
     * setupfolder
     * @param {string} folder folder name
     */
    setupfolder(folder) {
        this.storage = multer.diskStorage({
            destination(req, file, cb) {
                cb(null, `public/uploads/${folder}/`)
            },
            filename(req, file, cb) {
                const randomtext = `${Date.now()}_${Math.floor(100000 + Math.random() * 900000)}`
                cb(null, `${file.fieldname}-${randomtext}.${mime.getExtension(file.mimetype)}`)
            },
        })
    }
    /**
     * multer Single upload
     * @param {string} fieldname folder name
     */
    multerSingleUpload(fieldname) {
        if (fieldname === 'lotupload') {
            this.setupfolder('auction')
            this.filter = this.imageFilter
        } else if (fieldname === 'csvs') {
            this.setupfolder('temp')
            this.filter = this.csvFilter
        }
        const upload = multer({
            storage: this.storage,
            fileFilter: this.filter,
            errorHandling: 'manual',
        })
        return upload.single(fieldname)
    }
    /**
     * multer Multiple Upload
     * @param {string} fieldname folder name
     * @param {number} total total images count
     */
    multerMultipleUpload(fieldname, total) {
        if (fieldname === 'ig_lotupload' || fieldname === 'ph_upload') {
            this.setupfolder('product')
            this.filter = this.imageFilter
        }
        const upload = multer({ storage: this.storage, fileFilter: this.filter })
        return upload.array(fieldname, total)
    }
}

module.exports = multerModule