@fontoxml/fontoxml-development-tools
Version:
Development tools for Fonto.
98 lines (86 loc) • 2.3 kB
JavaScript
import path from 'path';
import { parseXmlDocument } from 'slimdom';
/** @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 (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;
req.cms.createNew(
documentId,
content,
currentSession,
(error, documentId) => {
if (error) {
if (error.status === 409) {
res.status(409).end();
} else {
res.status(500).send(error);
}
return;
}
req.cms.getLatestRevisionId(
documentId,
currentSession.editSessionToken,
(error, revisionId) => {
if (error) {
res.status(500).send(error);
return;
}
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;