visitsTracker = $visitsTracker; $this->translator = $translator; } /** * @param Request $request * @return Response * @throws \InvalidArgumentException */ public function handle(Request $request): Response { $shortCode = $request->getAttribute('shortCode'); $startDate = $this->getDateQueryParam($request, 'startDate'); $endDate = $this->getDateQueryParam($request, 'endDate'); try { $visits = $this->visitsTracker->info($shortCode, new DateRange($startDate, $endDate)); return new JsonResponse([ 'visits' => [ 'data' => $visits, ], ]); } catch (InvalidArgumentException $e) { $this->logger->warning('Provided nonexistent short code' . PHP_EOL . $e); return new JsonResponse([ 'error' => RestUtils::getRestErrorCodeFromException($e), 'message' => sprintf( $this->translator->translate('Provided short code %s does not exist'), $shortCode ), ], self::STATUS_NOT_FOUND); } catch (\Exception $e) { $this->logger->error('Unexpected error while parsing short code' . PHP_EOL . $e); return new JsonResponse([ 'error' => RestUtils::UNKNOWN_ERROR, 'message' => $this->translator->translate('Unexpected error occurred'), ], self::STATUS_INTERNAL_SERVER_ERROR); } } private function getDateQueryParam(Request $request, string $key): ?Chronos { $query = $request->getQueryParams(); return ! isset($query[$key]) || empty($query[$key]) ? null : Chronos::parse($query[$key]); } }