From 38fb5a8dfc0fea5a6c3e537d134842d93e27a72d Mon Sep 17 00:00:00 2001 From: Hajar RAHMOUNI Date: Sun, 31 Dec 2023 11:17:05 +0100 Subject: [PATCH 1/2] refacto : one controller and service for chart routes --- ...hartController.php => ChartController.php} | 32 +++++++++++++++---- api/src/Entity/Sale.php | 15 +++++++-- .../{BarChartService.php => ChartService.php} | 25 ++++++++++++++- 3 files changed, 62 insertions(+), 10 deletions(-) rename api/src/Controller/{BarChartController.php => ChartController.php} (50%) rename api/src/Service/{BarChartService.php => ChartService.php} (79%) diff --git a/api/src/Controller/BarChartController.php b/api/src/Controller/ChartController.php similarity index 50% rename from api/src/Controller/BarChartController.php rename to api/src/Controller/ChartController.php index 4b62fa4..7570e61 100644 --- a/api/src/Controller/BarChartController.php +++ b/api/src/Controller/ChartController.php @@ -3,22 +3,24 @@ namespace App\Controller; use App\Dto\BarChart\BarChartInput; -use App\Service\BarChartService; +use App\Service\ChartService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; +use Symfony\Component\Validator\Validation; +use Symfony\Component\Validator\Constraints as Assert; -class BarChartController extends AbstractController +class ChartController extends AbstractController { - private BarChartService $chartService; + private ChartService $chartService; - public function __construct(BarChartService $chartService) + public function __construct(ChartService $chartService) { $this->chartService = $chartService; } - #[Route('/sales/bar-chart/{startDate}/{endDate}/{granularity}', name: 'bar-chart', requirements: [ + #[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 @@ -40,4 +42,22 @@ class BarChartController extends AbstractController } return $this->json($output); } + + #[Route('/api/donut-chart/{year}', name: 'donut-chart', requirements: ['year' => '\d{4}'])] + public function getDonutChartData(string $year): JsonResponse + { + $validator = Validation::createValidator(); + $violations = $validator->validate($year, [ + 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->donutChartService->getDonutChartData($year); + + return $this->json($data); + } } diff --git a/api/src/Entity/Sale.php b/api/src/Entity/Sale.php index 309712a..1a150f7 100644 --- a/api/src/Entity/Sale.php +++ b/api/src/Entity/Sale.php @@ -6,20 +6,29 @@ use ApiPlatform\Metadata\ApiResource; use Doctrine\ORM\Mapping as ORM; use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\GetCollection; -use App\Controller\BarChartController; +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/{year}', + requirements: [ + 'year' => '\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 19789fa..811a1ab 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; + } } -- GitLab From 3f3d57e95a07f263ec0cf812b05c1d4ce8a9f32c Mon Sep 17 00:00:00 2001 From: firdaous elhalafi Date: Tue, 2 Jan 2024 14:34:06 +0100 Subject: [PATCH 2/2] la repartition des ventes par region --- api/config/packages/api_platform.yaml | 3 +++ api/src/Controller/ChartController.php | 11 +++++++---- api/src/Entity/Sale.php | 8 +++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/api/config/packages/api_platform.yaml b/api/config/packages/api_platform.yaml index 1406662..a85e02b 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/ChartController.php b/api/src/Controller/ChartController.php index 7570e61..68bd56e 100644 --- a/api/src/Controller/ChartController.php +++ b/api/src/Controller/ChartController.php @@ -2,6 +2,7 @@ namespace App\Controller; +use ApiPlatform\Metadata\ApiResource; use App\Dto\BarChart\BarChartInput; use App\Service\ChartService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; @@ -43,11 +44,13 @@ class ChartController extends AbstractController return $this->json($output); } - #[Route('/api/donut-chart/{year}', name: 'donut-chart', requirements: ['year' => '\d{4}'])] - public function getDonutChartData(string $year): JsonResponse + #[Route('/api/donut-chart/{id}', name: 'donut-chart', requirements: [ + 'id' => '\d{4}', + ])] + public function getDonutChartData(string $id): JsonResponse { $validator = Validation::createValidator(); - $violations = $validator->validate($year, [ + $violations = $validator->validate($id, [ new Assert\NotBlank(), new Assert\Range(['min' => 2018, 'max' => 2023]), ]); @@ -56,7 +59,7 @@ class ChartController extends AbstractController return new JsonResponse(['error' => 'Not Found'], Response::HTTP_NOT_FOUND); } - $data = $this->donutChartService->getDonutChartData($year); + $data = $this->chartService->getDonutChartData($id); return $this->json($data); } diff --git a/api/src/Entity/Sale.php b/api/src/Entity/Sale.php index 1a150f7..a5bbf6b 100644 --- a/api/src/Entity/Sale.php +++ b/api/src/Entity/Sale.php @@ -8,7 +8,6 @@ use ApiPlatform\Metadata\Get; use ApiPlatform\Metadata\GetCollection; use App\Controller\ChartController; - #[ApiResource( operations: [ new GetCollection( @@ -22,14 +21,13 @@ use App\Controller\ChartController; name: 'bar-chart' ), new GetCollection( - uriTemplate: '/api/donut-chart/{year}', + uriTemplate: '/api/donut-chart/{id}', requirements: [ - 'year' => '\d{4}', + 'id' => '\d{4}', ], controller: ChartController::class, name: 'donut-chart', - - ) + ), ] )] -- GitLab