@fontoxml/fontoxml-development-tools
Version:
Development tools for Fonto.
91 lines (80 loc) • 2.26 kB
JavaScript
import path from 'path';
import { parseXmlDocument } from 'slimdom';
import asyncRouteWithLockCleanupHandler from '../asyncRouteWithLockCleanupHandler.js';
/** @typedef {import('../../src/getAppConfig.js').DevCmsConfig} DevCmsConfig */
function createFileNameForNewDocument(content) {
let rootElementName = null;
try {
const document = parseXmlDocument(content);
rootElementName = document.documentElement.localName;
} catch (_err) {
// do nothing
}
return `${new Date().getTime()}${
rootElementName ? `-${rootElementName}` : ''
}.xml`;
}
/**
* @param {DevCmsConfig} config
*/
function configureDocumentPostRouteHandler(config) {
return asyncRouteWithLockCleanupHandler(async (acquireLock, req, res) => {
const folderId = req.body.folderId || '';
if (folderId && folderId.indexOf('..') !== -1) {
res.status(403).end();
return;
}
const content = req.body.content;
const fileName = createFileNameForNewDocument(content);
const context = req.body.context;
const currentSession = req.getFontoSession(context.editSessionToken);
const documentId = path.join(folderId, fileName).replace(/\\/g, '/');
const metadata = req.body.metadata;
const documentContext = {
isLockAcquired: true,
};
documentContext.documentMetadata = metadata;
let fileLock;
let revisionId;
try {
fileLock = await acquireLock(documentId);
revisionId = await req.cms.createFile(
documentId,
content,
currentSession.user,
currentSession.editSessionToken,
fileLock,
);
} catch (error) {
if (error.status === 409) {
res.status(409).end();
return;
}
throw error;
} finally {
fileLock?.release();
}
const documentLoadLock = {
...config.documentLoadLock,
...config.documentLoadLockOverrides[documentId],
};
res
.status(201)
.set('content-type', 'application/json; charset=utf-8')
.json({
documentId,
revisionId,
content,
documentContext,
metadata,
lock: {
isLockAcquired: documentLoadLock.isLockAcquired,
isLockAvailable: documentLoadLock.isLockAvailable,
reason: !documentLoadLock.isLockAvailable
? documentLoadLock.lockReason
: undefined,
},
});
});
}
export default configureDocumentPostRouteHandler;