Skip to content

Instantly share code, notes, and snippets.

@OctaneInteractive
Created April 6, 2023 09:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save OctaneInteractive/d03213c074d34cd9a0e54c66dde0e681 to your computer and use it in GitHub Desktop.
Save OctaneInteractive/d03213c074d34cd9a0e54c66dde0e681 to your computer and use it in GitHub Desktop.
Routes in Express to process and upload files via Multer to Google Drive
module.exports = (Router, Joi, fileOperations) => {
const { services } = require('../common/configurations')
// Diagnostics.
const factoryForDiagnostics = require('../mixins/diagnostics')
const diagnostics = factoryForDiagnostics({ log4js: fileOperations.log4js, nameOfChannel: 'default', level: 'debug' })
// Mixins.
const MixinAssets = require('../mixins/assets')
// Modules.
const factoryForS3 = require('../modules/aws/s3')
const moduleForS3 = factoryForS3(fileOperations.aws, services.aws)
// Controllers.
const factoryForFiles = require('../controllers/files.js')
const controllerForFiles = factoryForFiles(Joi, fileOperations)
// Middleware.
const { authenticate } = require('../middleware/routes')
const date = new Date()
const [y, m, d] = [
// Year.
(() => date.getFullYear())(),
// Month.
(() => date.getMonth() + 1)(),
// Day.
(() => date.getDate())()
]
// Create a regular expression based on the allowable file extensions stored in a mixin.
let byExtension = `/\.(${MixinAssets().allowedToUploadByExtension.join('|')})$/`
Router.get('/google/drive/files/list', authenticate, (req, res) => {
controllerForFiles.getAllFilesFromDrive(req, res)
})
Router.post('/assets/files/upload/:fileExtension', authenticate, (req, res) => {
const fileFilter = function(req, file, returnFunction) {
if (!file.originalname.match(byExtension) && !MixinAssets().allowedToUploadByMimeType.includes(file.mimetype)) {
req.fileValidationError = 'Please choose a file of an allowed type to upload'
returnFunction(new Error("File isn't an allowed type"), false)
}
returnFunction(null, true)
}
let uploadViaMulter = fileOperations.multer({
fileFilter,
limits: {
fileSize: 1024 * 1024 * 2 // 2 megabytes.
}
}).single('fileToUpload')
uploadViaMulter(req, res, (uploadViaMulterError) => {
try {
if (req.fileValidationError) {
if (process.env.ENV !== 'production') console.error('Multer: A fileValidationError', req.fileValidationError)
return res.status(500).json(req.fileValidationError)
} else if (!req.file) {
if (process.env.ENV !== 'production') console.error('Multer: Not a valid file', uploadViaMulterError)
return res.status(500).json(uploadViaMulterError)
} else if (uploadViaMulterError instanceof fileOperations.multer.MulterError) {
if (process.env.ENV !== 'production') console.error('Multer: MulterError', uploadViaMulterError)
return res.status(500).json(uploadViaMulterError)
} else if (uploadViaMulterError) {
if (process.env.ENV !== 'production') console.error('Multer: Misc. Error', uploadViaMulterError)
return res.status(500).json(uploadViaMulterError)
}
const FactoryForGoogle = require('../modules/api/google')
return FactoryForGoogle({
typeOfAction: 'isDefault'
}).uploadFileToDrive({
userId: req.body.userId,
fileToUpload: req.file
})
} catch (error) {
if (process.env.ENV !== 'production') console.error(error)
diagnostics.error(`routes/files.js /assets/files/upload/:fileExtension ${error}`)
return res.status(500).json(error)
}
})
})
/**
*
* Uilities.
*
*/
Router.post('/assets/files/download', authenticate, (req, res) => {
controllerForFiles.downloadExistingFile(req, res)
})
Router.post('/assets/files/delete', authenticate, (req, res) => {
controllerForFiles.removeExistingFile(req, res)
})
return Router
}
@OctaneInteractive
Copy link
Author

A work in progress, one that allows someone to upload files to the appropriate endpoint.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment