@fontoxml/fontoxml-development-tools
Version:
Development tools for Fonto.
91 lines (77 loc) • 2.21 kB
JavaScript
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;