UNPKG

@overture-stack/lyric

Version:
68 lines (67 loc) 3.3 kB
import { readFileSync } from 'node:fs'; import bytes from 'bytes'; import { json, Router, urlencoded } from 'express'; import multer from 'multer'; import createSubmissionController from '../controllers/submissionController.js'; import { authMiddleware } from '../middleware/auth.js'; const router = ({ baseDependencies, authConfig, }) => { /* ======================= * * Local Router Middleware * * ======================= */ /** * Multer multipart form upload processor. Returns middleware that can capture uploaded files and make them * available at `req.files`. */ const upload = multer({ dest: '/tmp', limits: { fileSize: baseDependencies.submissionService?.maxFileSize } }); /** * File upload is done via a multi-part form. This form data includes both "files" and optionally a "fileEntityMap". * This middleware moves the content of the fileEntityMap out of the req.files property and into the req.body value * for the validation middleware to handle. * @param req * @param _res * @param next */ const extractFileEntityMap = (req, _res, next) => { if (Array.isArray(req.files)) { const mapPart = Array.isArray(req.files) ? req.files.find((file) => file.fieldname === 'fileEntityMap') : undefined; if (mapPart) { try { const fileReadOutput = readFileSync(mapPart.path, 'utf-8'); req.body = fileReadOutput; } catch { // Could not read the fileEntityMap part - proceed without it } req.files = req.files.filter((file) => file.fieldname === 'files'); } } next(); }; const submissionController = createSubmissionController({ baseDependencies, authConfig, }); // Handles null edgecase and values of 0 as no limit. const bytesFileLimit = bytes.format(baseDependencies.submissionService?.maxFileSize ?? 0) || undefined; const router = Router(); router.use(urlencoded({ extended: false })); router.use(json({ limit: bytesFileLimit, })); router.use(authMiddleware(authConfig)); router.get('/:submissionId', submissionController.getSubmissionById); router.get('/:submissionId/details', submissionController.getSubmissionDetailsById); router.delete('/:submissionId', submissionController.delete); router.delete('/:submissionId/:actionType', submissionController.deleteEntityName); router.get('/category/:categoryId', submissionController.getSubmissionsByCategory); router.get('/category/:categoryId/organization/:organization', submissionController.getActiveByOrganization); router.post('/category/:categoryId/data', submissionController.submit); router.put(`/category/:categoryId/data`, submissionController.editSubmittedData); router.post('/category/:categoryId/files', upload.any(), extractFileEntityMap, submissionController.submitFiles); router.delete(`/category/:categoryId/data/:systemId`, submissionController.deleteSubmittedDataBySystemId); router.post('/category/:categoryId/commit/:submissionId', submissionController.commit); return router; }; export default router;