export function registerWriteLayoutRoutes()

in apps/newsletters-api/src/app/routes/layouts.ts [50:92]


export function registerWriteLayoutRoutes(app: FastifyInstance) {
	app.post<{
		Body: unknown;
		Params: { editionId: string };
	}>('/api/layouts/:editionId', async (req, res) => {
		const { editionId } = req.params;
		const layout: unknown = req.body;
		const user = getUserProfile(req);
		const permissions = await permissionService.get(user.profile);

		if (!permissions.editLayouts) {
			return res
				.status(403)
				.send(makeErrorResponse(`You don't have permission to edit layouts.`));
		}

		const idParseResult = editionIdSchema.safeParse(editionId.toUpperCase());
		if (!idParseResult.success) {
			return res
				.status(400)
				.send(makeErrorResponse(`No such edition ${editionId}`));
		}

		const layoutParseResult = layoutSchema.safeParse(layout);
		if (!layoutParseResult.success) {
			return res.status(400).send(makeErrorResponse(`invalid layout data`));
		}

		// TO DO - need a separate route or param for 'create' requests
		// that will fail if the layout exists already rather than replacing with blanks
		const storageResponse = await layoutStore.update(
			idParseResult.data,
			layoutParseResult.data,
		);

		if (!storageResponse.ok) {
			return res
				.status(mapStorageFailureReasonToStatusCode(storageResponse.reason))
				.send(makeErrorResponse(storageResponse.message));
		}
		return makeSuccessResponse(storageResponse.data);
	});
}