src/Controller/VinController.php line 97

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\DataTransformer\VinOutputTransformer;
  4. use App\Entity\Vin;
  5. use App\Message\CheckVinMessage;
  6. use App\Service\Vin\VinService;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Nelmio\ApiDocBundle\Annotation\Model;
  9. use OpenApi\Annotations as OA;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
  14. use Symfony\Component\Messenger\MessageBusInterface;
  15. use Symfony\Component\RateLimiter\RateLimiterFactory;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Serializer\SerializerInterface;
  18. class VinController extends AbstractController
  19. {
  20.     public function __construct(
  21.         private VinService $checkVin,
  22.         private SerializerInterface $serializer,
  23.         private EntityManagerInterface $em,
  24.         private VinOutputTransformer $outputTransformer,
  25.         private MessageBusInterface $bus,
  26.     ) {
  27.     }
  28.     /**
  29.      * @OA\Response(
  30.      *     response="201",
  31.      *     description="Returns created vin",
  32.      *     @Model(type=Vin::class, groups={"index"})
  33.      * ),
  34.      * @OA\Response(
  35.      *     response="400",
  36.      *     description="Wrong input data"
  37.      * ),
  38.      * @OA\RequestBody(
  39.      *     required=true,
  40.      *     @OA\JsonContent(
  41.      *        type="object",
  42.      *        @OA\Property(property="vin", type="string", example="4GDDU03A8VD268007"),
  43.      *     ),
  44.      * )
  45.      */
  46.     #[Route('/api/vin'name'app_check_reports'methods: ['POST'], format'json')]
  47.     public function handleCheckReports(Request $requestRateLimiterFactory $anonymousApiLimiter): Response
  48.     {
  49.         $limiter $anonymousApiLimiter->create($request->getClientIp());
  50.         if (!$limiter->consume()->isAccepted()) {
  51.             throw new BadRequestHttpException('Rate Limit Exceeded');
  52.         }
  53.         try {
  54.             $payload \json_decode((string) $request->getContent(), true512JSON_THROW_ON_ERROR);
  55.         } catch (\JsonException $e) {
  56.             throw new BadRequestHttpException(\sprintf('Bad request: %s'$e->getMessage()));
  57.         }
  58.         $vin $payload['vin'] ?? null;
  59.         if ($vin === null) {
  60.             throw new BadRequestHttpException('Field: \'vin\' is required');
  61.         }
  62.         try {
  63.             $vin \strtoupper($vin);
  64.             $vinInstance $this->checkVin->getVin($vin);
  65.             $this->bus->dispatch(new CheckVinMessage($vinInstance));
  66.         } catch (\InvalidArgumentException $e) {
  67.             throw new BadRequestHttpException($e->getMessage());
  68.         }
  69.         return new Response($this->serializer->serialize(['vin' => $this->outputTransformer->transform($vinInstance)], 'json', ['groups' => 'index']), Response::HTTP_CREATED);
  70.     }
  71.     /**
  72.      * @OA\Response(
  73.      *     response="200",
  74.      *     description="Returns requested vin",
  75.      *     @Model(type=Vin::class, groups={"index"})
  76.      * ),
  77.      * @OA\Response(
  78.      *     response="400",
  79.      *     description="Returns if vin is not found",
  80.      * ),
  81.      * @OA\Parameter(
  82.      *     name="vin",
  83.      *     in="path",
  84.      *     required=true,
  85.      *     @OA\Schema(type="string")
  86.      * ),
  87.      */
  88.     #[Route('/api/vin/{vin}'name'app_get_vin'methods: ['GET'], format'json')]
  89.     public function handleGetVin(string $vin): Response
  90.     {
  91.         $vin \strtoupper($vin);
  92.         $vinInstance $this->em->getRepository(Vin::class)->findOneBy(['vin' => $vin]);
  93.         if (!$vinInstance instanceof Vin) {
  94.             throw new BadRequestHttpException(\sprintf('VIN (%s) was not found'$vin));
  95.         }
  96.         return new Response($this->serializer->serialize(['vin' => $this->outputTransformer->transform($vinInstance)], 'json', ['groups' => 'index']), Response::HTTP_OK);
  97.     }
  98. }