export function registerCurrentStepRoute()

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);
			}
		},
	);
}