UNPKG

@fontoxml/fontoxml-development-tools

Version:

Development tools for Fonto.

91 lines (80 loc) 2.26 kB
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;