@fontoxml/fontoxml-development-tools
Version:
Development tools for Fonto.
84 lines (75 loc) • 2.24 kB
JavaScript
import asyncRouteWithLockCleanupHandler from '../asyncRouteWithLockCleanupHandler.js';
import httpStatusCodeHelpers from './review-annotations/httpStatusCodeHelpers.js';
import { STATUS_CREATED } from './review-annotations/Result.js';
/** @typedef {import('../../src/getAppConfig.js').DevCmsConfig} DevCmsConfig */
/**
* @param {DevCmsConfig} config
*/
export default function configureReviewAnnotationReplyPostRouteHandler(config) {
return asyncRouteWithLockCleanupHandler(async (_acquireLock, req, res) => {
const {
context: { editSessionToken },
annotationIdentifier,
reply,
} = req.body;
if (!reply) {
res.status(400).send('Missing a "reply" field in the request.');
return;
}
if (!annotationIdentifier) {
res
.status(400)
.send('Missing an "annotationIdentifier" field in the request.');
return;
}
const timeoutSet = await config.debugConfiguration.getTimeoutConfigForRoute(
req.cms,
editSessionToken,
'/review/annotation/reply',
'POST',
);
if (timeoutSet) {
// Do not handle the request, but let it time out.
return new Promise(() => {});
}
const isDebuggingEnabled =
await config.debugConfiguration.isDebuggingEnabled(
req.cms,
editSessionToken,
);
if (isDebuggingEnabled) {
const stringToVerify = reply.metadata.reply;
const foundHttpStatusCode = httpStatusCodeHelpers.getDebugHttpStatusCode(
stringToVerify,
[400, 500],
);
if (foundHttpStatusCode && !foundHttpStatusCode.onDelete) {
httpStatusCodeHelpers.sendDebugHttpResponse(res, foundHttpStatusCode);
return;
}
}
const currentSession = req.getFontoSession(editSessionToken);
const addReplyResult = await req.repositories.annotation.addReply(
req.cms,
currentSession,
reply,
annotationIdentifier,
);
const httpStatusCode =
httpStatusCodeHelpers.mapAnnotationResultStatusToHttpStatusCode(
addReplyResult.status,
true,
);
if (addReplyResult.status !== STATUS_CREATED) {
res.status(httpStatusCode).end();
return;
}
res
.status(httpStatusCode)
.set('content-type', 'application/json; charset=utf-8')
.json({
revisionId: addReplyResult.revisionId,
reply: addReplyResult.annotation,
});
});
}