in apps/newsletters-api/src/app/routes/currentStep.ts [75:141]
export function registerCurrentStepRoute(app: FastifyInstance) {
app.post<{ Body: CurrentStepRouteRequest }>(
'/api/currentstep',
async (req, res): Promise<CurrentStepRouteResponse> => {
const user = getUserProfile(req);
const accessDeniedError = await getAccessDeniedError(user, req.body);
if (accessDeniedError) {
return res.status(403).send(accessDeniedError);
}
const requestBody: CurrentStepRouteRequest = req.body;
const layout = newslettersWorkflowStepLayout[requestBody.wizardId];
if (!layout) {
const errorResponse: CurrentStepRouteResponse = {
errorMessage: 'No layout found',
currentStepId: requestBody.stepId,
hasPersistentError: true,
};
return res.status(400).send(errorResponse);
}
const serviceInterface = user.profile
? requestBody.wizardId === 'LAUNCH_NEWSLETTER'
? makelaunchServiceForUser(user.profile)
: makeDraftServiceForUser(
user.profile,
makeSesClient(),
makeEmailEnvInfo(),
)
: undefined;
if (!serviceInterface) {
const errorResponse: CurrentStepRouteResponse = {
errorMessage: 'FAILED to CONSTRUCT SERVICE',
currentStepId: requestBody.stepId,
hasPersistentError: true,
};
return res.status(500).send(errorResponse);
}
try {
return await handleWizardRequestAndReturnWizardResponse(
requestBody,
layout,
serviceInterface,
);
} catch (error) {
if (error instanceof StateMachineError) {
const errorResponse: CurrentStepRouteResponse = {
errorMessage: error.message,
currentStepId: requestBody.stepId,
hasPersistentError: error.isPersistant,
};
return res.status(getHttpCode(error)).send(errorResponse);
}
const errorResponse: CurrentStepRouteResponse = {
errorMessage: 'UNHANDLED ERROR',
currentStepId: requestBody.stepId,
hasPersistentError: true,
};
return res.status(500).send(errorResponse);
}
},
);
}