@fontoxml/fontoxml-development-tools
Version:
Development tools for Fonto.
101 lines (92 loc) • 2.72 kB
JavaScript
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;