UNPKG

@fontoxml/fontoxml-development-tools

Version:

Development tools for Fonto.

101 lines (92 loc) 2.72 kB
import asyncRouteWithLockCleanupHandler from '../asyncRouteWithLockCleanupHandler.js'; import correlationIdRepository from './correlationIdRepository.js'; /** @typedef {import('../../src/getAppConfig.js').DevCmsConfig} DevCmsConfig */ /** * @param {DevCmsConfig} _config */ function configureDocumentCompareRouteHandler(_config) { return asyncRouteWithLockCleanupHandler(async (acquireLock, req, res) => { const { documentAId, documentARevisionId, documentBId, documentBRevisionId, } = req.query; if ( !documentBRevisionId || !documentBId || !documentARevisionId || !documentAId ) { res.status(400).end(); return; } // Because these requests do not originate from the editor, but from an other server, we // have no edit session token. We do, however, have an correlationId which we may resolve // to the editSessionToken used by the corresponding call to the proxy const editSessionToken = correlationIdRepository.getEditSessionTokenForRequest(req); const fileLockA = await acquireLock(documentAId); const revisionsAndLatestContentA = await req.cms.getRevisionsAndLatestContent( documentAId, editSessionToken, fileLockA, ); const revisionsA = revisionsAndLatestContentA?.revisions; const contentA = await req.cms.getFileByRevisionId( documentAId, documentARevisionId, editSessionToken, fileLockA, ); fileLockA.release(); const fileLockB = await acquireLock(documentBId); const revisionsAndLatestContentB = await req.cms.getRevisionsAndLatestContent( documentBId, editSessionToken, fileLockB, ); const revisionsB = revisionsAndLatestContentB?.revisions; const contentB = await req.cms.getFileByRevisionId( documentBId, documentBRevisionId, editSessionToken, fileLockB, ); fileLockB.release(); const revisionMetadataA = revisionsA?.find( (revision) => revision.id === documentARevisionId, ); const revisionMetadataB = revisionsB?.find( (revision) => revision.id === documentBRevisionId, ); if ( contentA === null || contentB === null || !revisionMetadataA || !revisionMetadataB ) { // We did not find something res.status(404).end(); return; } res .status(200) .set('content-type', 'application/json; charset=utf-8') .json({ documentARevision: { content: contentA, author: revisionMetadataA.author, lastModifiedTimestamp: revisionMetadataA.lastModifiedTimestamp, }, documentBRevision: { content: contentB, author: revisionMetadataB.author, lastModifiedTimestamp: revisionMetadataB.lastModifiedTimestamp, }, }); }); } export default configureDocumentCompareRouteHandler;