UNPKG

@fontoxml/fontoxml-development-tools

Version:

Development tools for Fonto.

129 lines (116 loc) 2.84 kB
/** @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 async (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] ); } let documentIdContentTuples; try { documentIdContentTuples = await Promise.all( documentIds.map((id) => { return new Promise((resolve, reject) => { req.cms.load(id, editSessionToken, (error, content) => { if (error) { reject(error); return; } resolve({ id, content }); }); }); }), ); } catch (error) { if (error.status === 404) { res.status(404).end(); } else { res.status(500).end(); } return; } let documents; try { documents = await Promise.all( documentIdContentTuples.map(({ id, content }) => { return new Promise((resolve, reject) => { req.cms.getLatestRevisionId( id, editSessionToken, (error, revisionId) => { if (error) { reject(error); return; } const documentLoadLock = { ...config.documentLoadLock, ...config.documentLoadLockOverrides[id], }; resolve( createDocument( id, revisionId, content, documentLoadLock ) ); } ); }); }) ); } catch (error) { res.status(500).send(error); return; } 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;