GpsCoordinateSearchingDataProvider.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\DataProvider\Utils;
  4. use ApiPlatform\Core\DataProvider\CollectionDataProviderInterface;
  5. use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
  6. use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
  7. use ApiPlatform\Core\Identifier\CompositeIdentifierParser;
  8. use App\ApiResources\Utils\GpsCoordinate;
  9. use App\Service\Utils\GpsCoordinateUtils;
  10. use Symfony\Component\HttpFoundation\RequestStack;
  11. /**
  12. * Class GpsCoordinateSearchingDataProvider : custom provider pour assurer l'alimentation de la ressource GpsCoordinate
  13. * @package App\DataProvider\Utils
  14. */
  15. final class GpsCoordinateSearchingDataProvider implements ItemDataProviderInterface, CollectionDataProviderInterface, RestrictedDataProviderInterface
  16. {
  17. public function __construct(
  18. private GpsCoordinateUtils $gpsCoordinateUtils,
  19. private RequestStack $requestStack
  20. )
  21. { }
  22. public function supports(string $resourceClass, string $operationName = null, array $context = []): bool
  23. {
  24. return GpsCoordinate::class === $resourceClass;
  25. }
  26. public function getCollection(string $resourceClass, string $operationName = null): iterable
  27. {
  28. $request = $this->requestStack->getCurrentRequest();
  29. $responses = [];
  30. try{
  31. $addresses = $this->gpsCoordinateUtils->searchGpsCoordinates(
  32. $request->get('street'),
  33. $request->get('cp'),
  34. $request->get('city')
  35. );
  36. foreach ($addresses as $address){
  37. $responses[] = $this->gpsCoordinateUtils->createGpsCoordinate($address);
  38. }
  39. }catch (\Exception $exception){
  40. $responses[] = new GpsCoordinate();
  41. }
  42. return $responses;
  43. }
  44. public function getItem(string $resourceClass, $id, string $operationName = null, array $context = []): GpsCoordinate
  45. {
  46. $ids = CompositeIdentifierParser::parse($id);
  47. try{
  48. $address = $this->gpsCoordinateUtils->reverseGpsCoordinates(floatval($ids['latitude']), floatval($ids['longitude']));
  49. $gpsCoordinateResponse = $this->gpsCoordinateUtils->createGpsCoordinate($address);
  50. }catch (\Exception $exception){
  51. $gpsCoordinateResponse = new GpsCoordinate();
  52. }
  53. return $gpsCoordinateResponse;
  54. }
  55. }