@fontoxml/fontoxml-development-tools
Version:
Development tools for Fonto.
155 lines (143 loc) • 4.46 kB
JavaScript
/** @typedef {import('../../src/getAppConfig.js').DevCmsConfig} DevCmsConfig */
let warningAboutUnsupportedConfigurationWasLogged = false;
/**
* @param {DevCmsConfig} config
*/
export default function configureDocumentStatePostRouteHandler(config) {
return (req, res) => {
Promise.all(
req.body.documents.map(({ documentContext, documentId }) => {
return new Promise((resolve) => {
req.cms.getLatestRevisionId(
documentId,
req.body.context.editSessionToken,
(error, revisionId) => {
if (error) {
resolve({
status: 404,
});
return;
}
const documentLoadLock = {
...config.documentLoadLock,
...config.documentLoadLockOverrides[documentId],
};
const revisionIdOnUnlock =
config.additionalRevisionIdOn.unlock;
if (
!warningAboutUnsupportedConfigurationWasLogged &&
revisionIdOnUnlock &&
documentLoadLock.releaseLocksOnStateRequest
) {
console.warn(
`\nGenerating additional revision id on 'unlock' while also having release locks on state request enabled. This will cause out of sync documents states.`,
);
warningAboutUnsupportedConfigurationWasLogged = true;
}
const wasLockAcquired = documentContext
? documentLoadLock.isLockAvailable &&
documentContext.isLockAcquired
: documentLoadLock.isLockAcquired;
if (
// No need to generate a new revision id if the document will not be
// released. Either due to configuration or due to it already being not
// acquired.
!revisionIdOnUnlock ||
!documentLoadLock.releaseLocksOnStateRequest ||
!wasLockAcquired
) {
const isLockAcquired =
documentLoadLock.releaseLocksOnStateRequest
? false
: wasLockAcquired;
resolve({
status: 200,
body: {
revisionId,
lock: {
isLockAcquired,
isLockAvailable: documentLoadLock.isLockAvailable,
reason: !documentLoadLock.isLockAvailable
? documentLoadLock.lockReason
: undefined,
},
},
});
} else {
req.cms.load(
documentId,
req.body.context.editSessionToken,
(error, content) => {
if (error) {
resolve({ status: 500 });
return;
}
const currentSession = req.getFontoSession(
req.body.context.editSessionToken,
);
req.cms.save(
documentId,
content,
currentSession,
(error) => {
if (error) {
resolve({ status: 500 });
return;
}
// Retrieve the latest revision id (again) to return to the client.
req.cms.getLatestRevisionId(
documentId,
currentSession.editSessionToken,
(error, updatedRevisionId) => {
if (error) {
resolve({ status: 500 });
return;
}
if (revisionId === updatedRevisionId) {
const error = new Error(
`A new revision id was not generated as expected. The revision id remains: ${revisionId}".`,
);
console.log('');
console.error(error);
resolve({ status: 500 });
return;
}
resolve({
status: 200,
body: {
revisionId: updatedRevisionId,
lock: {
isLockAcquired: false,
isLockAvailable:
documentLoadLock.isLockAvailable,
reason: !documentLoadLock.isLockAvailable
? documentLoadLock.lockReason
: undefined,
},
},
});
},
);
},
);
},
);
}
},
);
});
}),
).then((results) => {
// The endpoint does not support a 500 status per result, so we will return a 500 on the
// whole request instead.
if (results.some((result) => result.status === 500)) {
res.status(500).send();
return;
}
res
.status(200)
.set('content-type', 'application/json; charset=utf-8')
.json({ results });
});
};
}