Created
April 6, 2023 09:45
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
A work in progress, one that allows someone to upload files to the appropriate endpoint.