@fontoxml/fontoxml-development-tools
Version:
Development tools for Fonto.
96 lines (82 loc) • 2.12 kB
JavaScript
import fs from 'fs-extra';
import path from 'path';
/** @typedef {import('../../src/getAppConfig.js').DevCmsConfig} DevCmsConfig */
/**
* @param {DevCmsConfig} config
*/
function configureAssetPostRouteHandler(config) {
return (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) {
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;
// Make sure destination folder is created
fs.mkdirs(destinationFolder, function (error) {
if (error) {
res.status(500).send(error);
return;
}
fs.move(file.path, absoluteFilePath, function (error) {
if (error) {
res.status(500).send(error);
return;
}
res.status(201)
.set('content-type', 'application/json; charset=utf-8')
.json({
id: filePath,
type,
label: originalName,
metadata,
});
});
});
};
}
export default configureAssetPostRouteHandler;