UNPKG

@fontoxml/fontoxml-development-tools

Version:

Development tools for Fonto.

91 lines (77 loc) 2.21 kB
import fs from 'fs-extra'; import path from 'path'; import asyncRouteWithLockCleanupHandler from '../asyncRouteWithLockCleanupHandler.js'; /** @typedef {import('../../src/getAppConfig.js').DevCmsConfig} DevCmsConfig */ /** * @param {DevCmsConfig} config */ function configureAssetPostRouteHandler(config) { return asyncRouteWithLockCleanupHandler(async (acquireLock, req, res) => { // Get request from correct multipart let request; if (req.body.request) { request = req.body.request; } else { request = req.body; } // Might not be parsed yet due to missing Content-Type: application/json request header if (typeof request === 'string') { request = JSON.parse(request); } const type = request['type']; const folderId = request.folderId || ''; const metadata = request.metadata || {}; const file = req.files.find( (uploadedFile) => uploadedFile.fieldname === 'file' ); if (!file) { res.status(400).end(); return; } if (!file.size) { await fs.unlink(file.path); res.status(400).end(); return; } const fileExtension = path.extname(file.originalname); const originalName = path.basename(file.originalname, fileExtension); const uniqueFileName = `${originalName}-${new Date().getTime()}${fileExtension}`; let filePath = path.join(folderId, uniqueFileName); const destinationFolder = path.join( config.root, 'dev-cms', 'uploads', folderId ); const absoluteFilePath = path.join( config.root, 'dev-cms', 'uploads', filePath ); if (path.sep === '\\') { filePath = filePath.replace(/\\/g, '/'); } if (folderId && folderId.indexOf('..') !== -1) { res.status(403).end(); return; } metadata.isCmsUpload = true; // TODO: Make this work with memory store as well. const fileLock = await acquireLock(filePath); // Make sure destination folder is created await fs.mkdirs(destinationFolder); await fs.move(file.path, absoluteFilePath); fileLock.release(); res .status(201) .set('content-type', 'application/json; charset=utf-8') .json({ id: filePath, type, label: originalName, metadata, }); }); } export default configureAssetPostRouteHandler;