src/EventSubscriber/LocationUpdatedSubscriber.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use ApiPlatform\Symfony\EventListener\EventPriorities;
  4. use App\Entity\Customer;
  5. use App\Service\Geocoding;
  6. use App\Service\Twilio;
  7. use JetBrains\PhpStorm\ArrayShape;
  8. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  9. use Symfony\Component\HttpKernel\Event\ViewEvent;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. use function get_class;
  12. use function in_array;
  13. use function method_exists;
  14. final class LocationUpdatedSubscriber implements EventSubscriberInterface
  15. {
  16.     public function __construct(
  17.         private readonly Geocoding $geocoding,
  18.         private readonly Twilio $twilio,
  19.     )
  20.     {
  21.     }
  22.     #[ArrayShape([KernelEvents::VIEW => "array"])]
  23.     public static function getSubscribedEvents(): array
  24.     {
  25.         return [
  26.             KernelEvents::VIEW => ['checkLocation'EventPriorities::POST_WRITE],
  27.         ];
  28.     }
  29.     public function checkLocation(ViewEvent $event): void
  30.     {
  31.         $entity $event->getControllerResult();
  32.         $method $event->getRequest()->getMethod();
  33.         if (!in_array($method, ['POST''PUT''PATCH'])) {
  34.             return;
  35.         }
  36.         # at the time of writing, this is just Pond or Employee but could expand in the future and this caters for that
  37.         if (method_exists($entity'getLatitude') && method_exists($entity'getLongitude')) {
  38.             $this->setCoordinates($entity);
  39.             return;
  40.         }
  41.         # when a customer is posted, it contains ponds
  42.         if ($entity instanceof Customer) {
  43.             foreach ($entity->getPonds() as $pond) {
  44.                 $this->setCoordinates($pond);
  45.             }
  46.         }
  47.     }
  48.     private function setCoordinates($entity): void
  49.     {
  50.         $result $this->geocoding->updateEntityLngLat($entity);
  51.         # if the Google API didn't give us coordinates then notify We Do Code to investigate
  52.         if (!$result) {
  53.             $entityClass get_class($entity);
  54.             $address method_exists($entity'getAddressAsString') ? $entity->getAddressAsString() : '';
  55.             $content = <<<TEXT
  56. We failed to get coordinates for $entityClass entity {$entity->getId()}.
  57. The address is: $address
  58. TEXT;
  59.             $this->twilio->email(
  60.                 toAddress'[email protected]',
  61.                 toName'We Do Code',
  62.                 content$content,
  63.                 subject'[PNW] Failed to get coordinates',
  64.                 formattrue,
  65.             );
  66.         }
  67.     }
  68. }