diff --git a/api/config/packages/api_platform.yaml b/api/config/packages/api_platform.yaml index 1406662e33aac5a40c88543cf806f22bef3a49be..a85e02b0eb32546801967cc5fc1a59698e209d8b 100644 --- a/api/config/packages/api_platform.yaml +++ b/api/config/packages/api_platform.yaml @@ -19,3 +19,6 @@ api_platform: rfc_7807_compliant_errors: true event_listeners_backward_compatibility_layer: false keep_legacy_inflector: false + mapping: + paths: [ '%kernel.project_dir%/src/Entity' ] + diff --git a/api/src/Controller/BarChartController.php b/api/src/Controller/BarChartController.php deleted file mode 100644 index 4b62fa4413012e8cd46ef50d7fd5eb129a5f45e8..0000000000000000000000000000000000000000 --- a/api/src/Controller/BarChartController.php +++ /dev/null @@ -1,43 +0,0 @@ -chartService = $chartService; - } - - #[Route('/sales/bar-chart/{startDate}/{endDate}/{granularity}', name: 'bar-chart', requirements: [ - 'startDate' => '\d{4}-\d{2}-\d{2}', // YYYY-MM-DD - 'endDate' => '\d{4}-\d{2}-\d{2}', // YYYY-MM-DD - 'granularity' => 'day|month|year', // day, month, ou year - ])] - public function getChartData(string $startDate, string $endDate, string $granularity): JsonResponse - { - $input = new BarChartInput(); - $input->start = $startDate; - $input->end = $endDate; - $input->granularity = $granularity; - - $chartData = $this->chartService->getBarChartData($input); - $output = []; - foreach ($chartData as $data) { - $output[] = [ - 'date' => $data->date, - 'occurrences' => $data->occurrences, - ]; - } - return $this->json($output); - } -} diff --git a/api/src/Controller/ChartController.php b/api/src/Controller/ChartController.php new file mode 100644 index 0000000000000000000000000000000000000000..68bd56e0da3c4598bfde985481f94a3c458a7d11 --- /dev/null +++ b/api/src/Controller/ChartController.php @@ -0,0 +1,66 @@ +chartService = $chartService; + } + + #[Route('/api/bar-chart/{startDate}/{endDate}/{granularity}', name: 'bar-chart', requirements: [ + 'startDate' => '\d{4}-\d{2}-\d{2}', // YYYY-MM-DD + 'endDate' => '\d{4}-\d{2}-\d{2}', // YYYY-MM-DD + 'granularity' => 'day|month|year', // day, month, ou year + ])] + public function getChartData(string $startDate, string $endDate, string $granularity): JsonResponse + { + $input = new BarChartInput(); + $input->start = $startDate; + $input->end = $endDate; + $input->granularity = $granularity; + + $chartData = $this->chartService->getBarChartData($input); + $output = []; + foreach ($chartData as $data) { + $output[] = [ + 'date' => $data->date, + 'occurrences' => $data->occurrences, + ]; + } + return $this->json($output); + } + + #[Route('/api/donut-chart/{id}', name: 'donut-chart', requirements: [ + 'id' => '\d{4}', + ])] + public function getDonutChartData(string $id): JsonResponse + { + $validator = Validation::createValidator(); + $violations = $validator->validate($id, [ + new Assert\NotBlank(), + new Assert\Range(['min' => 2018, 'max' => 2023]), + ]); + + if (count($violations) > 0) { + return new JsonResponse(['error' => 'Not Found'], Response::HTTP_NOT_FOUND); + } + + $data = $this->chartService->getDonutChartData($id); + + return $this->json($data); + } +} diff --git a/api/src/Entity/Sale.php b/api/src/Entity/Sale.php index daf8ab9451fa0051b1e6c711619b62592eebdf7e..3dcb1b57e55e8c9cc614eab0ad80b1494842345b 100644 --- a/api/src/Entity/Sale.php +++ b/api/src/Entity/Sale.php @@ -7,21 +7,29 @@ use ApiPlatform\Metadata\GetCollection; use App\Controller\SaleController; use Doctrine\ORM\Mapping as ORM; use ApiPlatform\Metadata\Get; -use App\Controller\BarChartController; - +use ApiPlatform\Metadata\GetCollection; +use App\Controller\ChartController; #[ApiResource( operations: [ new GetCollection( - uriTemplate: '/sales/bar-chart/{startDate}/{endDate}/{granularity}', + uriTemplate: '/api/bar-chart/{startDate}/{endDate}/{granularity}', requirements: [ 'startDate' => '\d{4}-\d{2}-\d{2}', 'endDate' => '\d{4}-\d{2}-\d{2}', 'granularity' => 'day|month|year', ], - controller: BarChartController::class, + controller: ChartController::class, name: 'bar-chart' - ) + ), + new GetCollection( + uriTemplate: '/api/donut-chart/{id}', + requirements: [ + 'id' => '\d{4}', + ], + controller: ChartController::class, + name: 'donut-chart', + ), ] )] diff --git a/api/src/Service/BarChartService.php b/api/src/Service/ChartService.php similarity index 79% rename from api/src/Service/BarChartService.php rename to api/src/Service/ChartService.php index 19789fa46ef7fcb9f1dd4e09c9480d1c79ad7372..811a1ab2a23ee6c0349d7696ba182904dbf1b315 100644 --- a/api/src/Service/BarChartService.php +++ b/api/src/Service/ChartService.php @@ -7,7 +7,7 @@ use App\Dto\BarChart\BarChartOutput; use Doctrine\ORM\EntityManagerInterface; use App\Entity\Sale; -class BarChartService +class ChartService { private EntityManagerInterface $entityManager; @@ -77,5 +77,28 @@ class BarChartService return $output; } + + public function getDonutChartData(string $year): array + { + $repository = $this->entityManager->getRepository(Sale::class); + + $result = $repository->createQueryBuilder('s') + ->select('s.region', 'COUNT(s.id) as occurrences') + ->andWhere('YEAR(s.date) = :year') + ->setParameter('year', $year) + ->groupBy('s.region') + ->getQuery() + ->getResult(); + + $data = []; + foreach ($result as $row) { + $data[] = [ + 'region' => $row['region'], + 'occurrences' => (int)$row['occurrences'], + ]; + } + + return $data; + } }