@fontoxml/fontoxml-development-tools
Version:
Development tools for Fonto.
109 lines (95 loc) • 2.74 kB
JavaScript
import asyncRouteWithLockCleanupHandler from '../asyncRouteWithLockCleanupHandler.js';
/** @typedef {import('../../src/getAppConfig.js').DevCmsConfig} DevCmsConfig */
function createDocument(documentId, revisionId, content, lock) {
return {
documentId,
revisionId,
content,
lock: {
isLockAcquired: lock.isLockAcquired,
isLockAvailable: lock.isLockAvailable,
reason: !lock.isLockAvailable ? lock.lockReason : undefined,
},
metadata: {},
documentContext: {
documentMetadata: {},
isLockAcquired: lock.isLockAcquired,
},
};
}
/**
* @param {DevCmsConfig} config
*/
function configureDocumentGetRouteHandler(config) {
return asyncRouteWithLockCleanupHandler(async (acquireLock, req, res) => {
const editSessionToken =
req.query &&
req.query.context &&
JSON.parse(req.query.context).editSessionToken;
let documentIds = [req.query.documentId];
if (
req.query.includeAdditionalDocuments === 'true' &&
config.additionalDocuments &&
config.additionalDocuments[req.query.documentId]
) {
documentIds = documentIds.concat(
config.additionalDocuments[req.query.documentId],
);
}
const documentIdContentTuples = await Promise.all(
documentIds.map(async (id) => {
const fileLock = await acquireLock(id);
const contentAndLatestRevisionId =
await req.cms.getFileAndLatestRevisionId(
id,
editSessionToken,
fileLock,
);
fileLock.release();
if (!contentAndLatestRevisionId) {
return null;
}
return {
id,
content: contentAndLatestRevisionId.content,
revisionId: contentAndLatestRevisionId.revisionId,
};
}),
);
// If any of the documents are not found, return 404.
if (documentIdContentTuples.some((tuple) => tuple === null)) {
res.status(404).end();
return;
}
const documents = await Promise.all(
documentIdContentTuples.map(async ({ id, content, revisionId }) => {
const documentLoadLock = {
...config.documentLoadLock,
...config.documentLoadLockOverrides[id],
};
return createDocument(id, revisionId, content, documentLoadLock);
}),
);
const initialDocument = documents.find(
(document) => document.documentId === req.query.documentId,
);
const additionalDocuments = documents
.filter((document) => document.documentId !== req.query.documentId)
.map((additionalDocument) => {
return {
status: 200,
body: additionalDocument,
};
});
res
.status(200)
.set('content-type', 'application/json; charset=utf-8')
.json({
...initialDocument,
additionalDocuments: additionalDocuments.length
? additionalDocuments
: undefined,
});
});
}
export default configureDocumentGetRouteHandler;