query->has('dateFrom')) { throw new BadRequestHttpException('You must provide a dateFrom parameter'); } if (false === $dateFrom = \DateTimeImmutable::createFromFormat( \DateTimeImmutable::ATOM, $request->query->get('dateFrom') )) { throw new BadRequestHttpException('dateFrom not parsable'); } if (!$request->query->has('dateTo')) { throw new BadRequestHttpException('You must provide a dateTo parameter'); } if (false === $dateTo = \DateTimeImmutable::createFromFormat( \DateTimeImmutable::ATOM, $request->query->get('dateTo') )) { throw new BadRequestHttpException('dateTo not parsable'); } $total = $this->remoteCalendarConnector->countEventsForUser($user, $dateFrom, $dateTo); $paginator = $this->paginatorFactory->create($total); if (0 === $total) { return new JsonResponse( $this->serializer->serialize(new Collection([], $paginator), 'json'), JsonResponse::HTTP_OK, [], true ); } $events = $this->remoteCalendarConnector->listEventsForUser( $user, $dateFrom, $dateTo, $paginator->getCurrentPageFirstItemNumber(), $paginator->getItemsPerPage() ); // in some case, we cannot paginate: we have to fetch all the items at once. We must avoid // further requests by forcing the number of items returned. if (\count($events) > $paginator->getItemsPerPage()) { $paginator->setItemsPerPage(\count($events)); } $collection = new Collection($events, $paginator); return new JsonResponse( $this->serializer->serialize($collection, 'json', ['groups' => ['read']]), JsonResponse::HTTP_OK, [], true ); } }