$mailjetLists */ public function __construct( private readonly NewsletterManager $newsletterManager, private readonly LoggerInterface $logger, private readonly array $mailjetLists = [], ) { } #[Route('/newsletters', name: 'api_newsletters_all', methods: ['GET'])] public function index(): JsonResponse { return $this->json($this->newsletterManager->createListIdMapping(array_keys($this->mailjetLists))); } #[Route('/newsletter-subscriptions', name: 'api_newsletters_subscriptions', methods: ['POST'])] public function subscribe( #[MapRequestPayload(validationFailedStatusCode: Response::HTTP_BAD_REQUEST)] NewsletterSubscriptionRequest $request, ): JsonResponse { try { $result = $this ->newsletterManager ->requestApiSubscription( (string) $request->email, $request->listIds, array_keys($this->mailjetLists), $request->firstName, $request->lastName, ) ; } catch (NewsletterListNotAllowedException $exception) { return $this->badRequest($exception->getMessage(), [ 'listIds' => $exception->getListIds(), 'unknownListIds' => $exception->getUnknownListIds(), ]); } catch (\InvalidArgumentException $exception) { return $this->badRequest($exception->getMessage(), [ 'listIds' => $request->listIds, ]); } catch (NewsletterProviderException $exception) { $this->logger->warning('Newsletter subscription request failed', [ 'email' => $request->email, 'list_ids' => $request->listIds, 'error' => $exception->getMessage(), ]); return new JsonResponse([ 'success' => false, 'email' => $request->email, 'listIds' => $request->listIds, 'message' => 'Newsletter subscription request could not be processed.', ], Response::HTTP_SERVICE_UNAVAILABLE); } return new JsonResponse( $this->responsePayload($result), NewsletterSubscriptionRequestResult::STATE_CONFIRMATION_REQUESTED === $result->state ? Response::HTTP_ACCEPTED : Response::HTTP_OK, ); } /** * @param array $extra */ private function badRequest(string $message, array $extra = []): JsonResponse { return new JsonResponse(array_merge([ 'success' => false, 'message' => $message, ], $extra), Response::HTTP_BAD_REQUEST); } /** * @return array */ private function responsePayload(NewsletterSubscriptionRequestResult $result): array { return [ 'success' => true, 'email' => $result->email, 'lists' => array_map( fn (array $list): array => array_merge($list, [ 'state' => $result->stateForList((int) $list['id']), ]), $this->newsletterManager->createListIdMapping($result->listIds), ), 'state' => $result->state, 'confirmationRequested' => $result->confirmationRequested, ]; } }