UNPKG

@fontoxml/fontoxml-development-tools

Version:

Development tools for Fonto.

155 lines (143 loc) 4.46 kB
/** @typedef {import('../../src/getAppConfig.js').DevCmsConfig} DevCmsConfig */ let warningAboutUnsupportedConfigurationWasLogged = false; /** * @param {DevCmsConfig} config */ export default function configureDocumentStatePostRouteHandler(config) { return (req, res) => { Promise.all( req.body.documents.map(({ documentContext, documentId }) => { return new Promise((resolve) => { req.cms.getLatestRevisionId( documentId, req.body.context.editSessionToken, (error, revisionId) => { if (error) { resolve({ status: 404, }); return; } const documentLoadLock = { ...config.documentLoadLock, ...config.documentLoadLockOverrides[documentId], }; const revisionIdOnUnlock = config.additionalRevisionIdOn.unlock; if ( !warningAboutUnsupportedConfigurationWasLogged && revisionIdOnUnlock && documentLoadLock.releaseLocksOnStateRequest ) { console.warn( `\nGenerating additional revision id on 'unlock' while also having release locks on state request enabled. This will cause out of sync documents states.`, ); warningAboutUnsupportedConfigurationWasLogged = true; } const wasLockAcquired = documentContext ? documentLoadLock.isLockAvailable && documentContext.isLockAcquired : documentLoadLock.isLockAcquired; if ( // No need to generate a new revision id if the document will not be // released. Either due to configuration or due to it already being not // acquired. !revisionIdOnUnlock || !documentLoadLock.releaseLocksOnStateRequest || !wasLockAcquired ) { const isLockAcquired = documentLoadLock.releaseLocksOnStateRequest ? false : wasLockAcquired; resolve({ status: 200, body: { revisionId, lock: { isLockAcquired, isLockAvailable: documentLoadLock.isLockAvailable, reason: !documentLoadLock.isLockAvailable ? documentLoadLock.lockReason : undefined, }, }, }); } else { req.cms.load( documentId, req.body.context.editSessionToken, (error, content) => { if (error) { resolve({ status: 500 }); return; } const currentSession = req.getFontoSession( req.body.context.editSessionToken, ); req.cms.save( documentId, content, currentSession, (error) => { if (error) { resolve({ status: 500 }); return; } // Retrieve the latest revision id (again) to return to the client. req.cms.getLatestRevisionId( documentId, currentSession.editSessionToken, (error, updatedRevisionId) => { if (error) { resolve({ status: 500 }); return; } if (revisionId === updatedRevisionId) { const error = new Error( `A new revision id was not generated as expected. The revision id remains: ${revisionId}".`, ); console.log(''); console.error(error); resolve({ status: 500 }); return; } resolve({ status: 200, body: { revisionId: updatedRevisionId, lock: { isLockAcquired: false, isLockAvailable: documentLoadLock.isLockAvailable, reason: !documentLoadLock.isLockAvailable ? documentLoadLock.lockReason : undefined, }, }, }); }, ); }, ); }, ); } }, ); }); }), ).then((results) => { // The endpoint does not support a 500 status per result, so we will return a 500 on the // whole request instead. if (results.some((result) => result.status === 500)) { res.status(500).send(); return; } res .status(200) .set('content-type', 'application/json; charset=utf-8') .json({ results }); }); }; }