diff --git a/src/Controller/ApiController.php b/src/Controller/ApiController.php index ce521b8d6a3f0a119994809b6908a82b182d8277..aa9d575cc4c0145d1798c70aaf16bda16132a076 100644 --- a/src/Controller/ApiController.php +++ b/src/Controller/ApiController.php @@ -14,6 +14,7 @@ use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory; use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader; use App\Entity\Transaction; use App\Entity\User; +use App\Service\CategoryService; use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; @@ -24,8 +25,9 @@ use Symfony\Component\Serializer\Normalizer\DateTimeNormalizer; class ApiController extends AbstractController { private Serializer $serializer; + private CategoryService $categoryService; - public function __construct() + public function __construct(CategoryService $categoryService) { $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); @@ -35,8 +37,27 @@ class ApiController extends AbstractController $normalizers = [$dateNormalizer, new ObjectNormalizer($classMetadataFactory, null, null, new ReflectionExtractor())]; $this->serializer = new Serializer($normalizers, $encoders); + + $this->categoryService = $categoryService; + } + + private function manageCategory(Transaction $transaction) + { + if ($transaction->getCategory() !== "auto-detect") return; + $category = $this->categoryService->getCategory($transaction->getLocation()); + $transaction->setCategory($category); + } + + private function checkTransactionAccess(Transaction $transaction) + { + /** + * @var User + */ + $user = $this->getUser(); + if (!$user->getTransactions()->contains($transaction)) throw $this->createNotFoundException(); } + #[Route('/api/transaction', name: 'api_transaction_list', methods: ['GET'])] public function list(): Response { @@ -45,10 +66,18 @@ class ApiController extends AbstractController */ $user = $this->getUser(); $transactions = $user->getTransactions(); - + return new Response($this->serializer->serialize($transactions, "json"), 200, ["Content-Type" => "application/json"]); } + #[Route("/api/transaction/{id}", name: 'api_transaction_get', methods: ['GET'])] + public function get(Transaction $transaction): Response + { + $this->checkTransactionAccess($transaction); + + return new Response($this->serializer->serialize($transaction, "json", 200, ["Content-Type" => "application/json"])); + } + #[Route('/api/transaction', name: 'api_transaction_create', methods: ['POST'])] public function create(Request $request, ManagerRegistry $doctrine): Response { @@ -62,6 +91,7 @@ class ApiController extends AbstractController } catch (\Exception $error) { return new Response($error, 400); } + $this->manageCategory($transaction); $user->addTransaction($transaction); $entityManager->persist($transaction); $entityManager->flush(); @@ -71,11 +101,7 @@ class ApiController extends AbstractController #[Route('/api/transaction/{id}', name: 'api_transaction_delete', methods: ['DELETE'])] public function delete(Transaction $transaction, ManagerRegistry $doctrine) { - /** - * @var User - */ - $user = $this->getUser(); - if (!$user->getTransactions()->contains($transaction)) throw $this->createNotFoundException(); + $this->checkTransactionAccess($transaction); $entityManager = $doctrine->getManager(); $entityManager->remove($transaction); @@ -87,11 +113,7 @@ class ApiController extends AbstractController #[Route('/api/transaction/{id}', name: 'api_transaction_update', methods: ['PATCH'])] public function update(Request $request, Transaction $transaction, ManagerRegistry $doctrine) { - /** - * @var User - */ - $user = $this->getUser(); - if (!$user->getTransactions()->contains($transaction)) throw $this->createNotFoundException(); + $this->checkTransactionAccess($transaction); $entityManager = $doctrine->getManager(); try { @@ -100,6 +122,8 @@ class ApiController extends AbstractController return new Response($error, 400); } + $this->manageCategory($transaction); + $entityManager->flush(); return new Response();