entityManager = $entityManager; $this->security = $security; } /** * @Route("/{id}/mark/read", name="chill_api_main_notification_mark_read", methods={"POST"}) */ public function markAsRead(Notification $notification): JsonResponse { return $this->markAs('read', $notification); } /** * @Route("/{id}/mark/unread", name="chill_api_main_notification_mark_unread", methods={"POST"}) */ public function markAsUnread(Notification $notification): JsonResponse { return $this->markAs('unread', $notification); } private function markAs(string $target, Notification $notification): JsonResponse { if (!$this->security->isGranted(NotificationVoter::NOTIFICATION_TOGGLE_READ_STATUS, $notification)) { throw new AccessDeniedException('Not allowed to toggle read status of notification'); } $user = $this->security->getUser(); if (!$user instanceof User) { throw new RuntimeException('not possible to mark as read by this user'); } switch ($target) { case 'read': $notification->markAsReadBy($user); break; case 'unread': $notification->markAsUnreadBy($user); break; default: throw new UnexpectedValueException("target not supported: {$target}"); } $this->entityManager->flush(); return new JsonResponse(null, JsonResponse::HTTP_ACCEPTED, [], false); } }