UNPKG

@fontoxml/fontoxml-development-tools

Version:

Development tools for Fonto.

109 lines (95 loc) 2.74 kB
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;