@fontoxml/fontoxml-development-tools
Version:
Development tools for Fonto.
129 lines (116 loc) • 2.84 kB
JavaScript
/** @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;