entityManager = $entityManager; $this->security = $security; } /** * @Route("/api/1.0/main/workflow/{id}/subscribe", methods={"POST"}) */ public function subscribe(EntityWorkflow $entityWorkflow, Request $request): Response { return $this->handleSubscription($entityWorkflow, $request, 'subscribe'); } /** * @Route("/api/1.0/main/workflow/{id}/unsubscribe", methods={"POST"}) */ public function unsubscribe(EntityWorkflow $entityWorkflow, Request $request): Response { return $this->handleSubscription($entityWorkflow, $request, 'unsubscribe'); } private function handleSubscription(EntityWorkflow $entityWorkflow, Request $request, string $action): JsonResponse { if (!$this->security->isGranted('IS_AUTHENTICATED_REMEMBERED')) { throw new AccessDeniedException(); } if (!$request->query->has('subscribe')) { throw new BadRequestHttpException('missing subscribe parameter'); } $user = $this->security->getUser(); switch ($request->query->get('subscribe')) { case 'final': switch ($action) { case 'subscribe': $entityWorkflow->addSubscriberToFinal($user); break; case 'unsubscribe': $entityWorkflow->removeSubscriberToFinal($user); break; default: throw new LogicException(); } break; case 'step': switch ($action) { case 'subscribe': $entityWorkflow->addSubscriberToStep($user); break; case 'unsubscribe': $entityWorkflow->removeSubscriberToStep($user); break; default: throw new LogicException(); } break; default: throw new BadRequestHttpException('subscribe parameter must be equal to "step" or "final"'); } $this->entityManager->flush(); return new JsonResponse( [ 'step' => $entityWorkflow->isUserSubscribedToStep($user), 'final' => $entityWorkflow->isUserSubscribedToFinal($user), ], JsonResponse::HTTP_OK, [], false ); } }