vendor/sintra/pimcore-webhooks/EventListener/WebHookListener.php line 44

Open in your IDE?
  1. <?php
  2. namespace WebHookBundle\EventListener;
  3.   
  4. use Pimcore\Event\Model\ElementEventInterface;
  5. use Pimcore\Event\Model\DataObjectEvent;
  6. use Pimcore\Log\ApplicationLogger;
  7. use WebHookBundle\Utils\ExportDataObject;
  8. use Symfony\Component\HttpClient\HttpClient;
  9. use Symfony\Component\Serializer\Encoder\XmlEncoder;
  10. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  11. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  12. use Symfony\Component\Serializer\Serializer;
  13. use Pimcore\Model\DataObject\ClassDefinition;
  14. use Pimcore\Model\Notification\Service\NotificationService;
  15. class WebHookListener {
  16.     
  17.     private $logger;
  18.     public function __construct(ApplicationLogger $logger) {
  19.         $this->logger $logger;
  20.     }
  21.     
  22.     public function onPreAdd (ElementEventInterface $e) {
  23.         $this->handleChange($e"preAdd");
  24.     }
  25.     public function onPostAdd (ElementEventInterface $e) {
  26.         $this->handleChange($e"postAdd");
  27.     }
  28.     public function onPostAddFailure (ElementEventInterface $e) {
  29.         $this->handleChange($e"postAddFailure");
  30.     }
  31.     public function onPreUpdate (ElementEventInterface $e) {
  32.         $this->handleChange($e"preUpdate");
  33.     }
  34.     public function onPostUpdate (ElementEventInterface $e) {
  35.         $this->handleChange($e"postUpdate");
  36.     }
  37.     public function onPostUpdateFailure (ElementEventInterface $e) {
  38.         $this->handleChange($e"postUpdateFailure");
  39.     }
  40.     public function onDeleteInfo (ElementEventInterface $e) {
  41.         $this->handleChange($e"deleteInfo");
  42.     }
  43.     public function onPreDelete (ElementEventInterface $e) {
  44.         $this->handleChange($e"preDelete");
  45.     }
  46.     public function onPostDelete (ElementEventInterface $e) {
  47.         $this->handleChange($e"postDelete");
  48.     }
  49.     public function onPostDeleteFailure (ElementEventInterface $e) {
  50.         $this->handleChange($e"postDeleteFailure");
  51.     }
  52.     public function onPostCopy (ElementEventInterface $e) {
  53.         $this->handleChange($e"postCopy");
  54.     }
  55.     public function onPostCsvItemExport (ElementEventInterface $e) {
  56.         $this->handleChange($e"postCsvItemExport");
  57.     }
  58.     public function handleChange(ElementEventInterface $e$eventName) {
  59.         
  60.         if ($e instanceof DataObjectEvent) {
  61.             $dataObject $e->getObject();
  62.             if($dataObject->getType() != "folder" && $dataObject->getPublished()) {
  63.                 $entityType $dataObject->getClassName();
  64.             } else {
  65.                 return 0;
  66.             }
  67.             $classesList = new ClassDefinition\Listing();
  68.             $classesList->setCondition("name LIKE ?", ["WebHook"]);
  69.             $classes $classesList->load();
  70.             if(count($classes)) { 
  71.                 $class '\\Pimcore\\Model\\DataObject\\WebHook\\Listing';
  72.                 \Pimcore\Model\DataObject\AbstractObject::setHideUnpublished(true);
  73.                 $webHooksList = new \Pimcore\Model\DataObject\WebHook\Listing();
  74.                 $webHooksList->setCondition("EntityType LIKE ? AND ListenedEvent LIKE ?", ["%".$entityType."%""%".$eventName."%"]);
  75.                 $webHooksList $webHooksList->load();
  76.                 $webHooks = array();
  77.                 foreach($webHooksList as $webHook) {
  78.                     if (in_array($eventName$webHook->getListenedEvent())) {
  79.                         if (in_array($entityType$webHook->getEntityType())) {
  80.                             $webHooks[] = $webHook;
  81.                         }
  82.                     }
  83.                 }
  84.                 if (count($webHooks)) {
  85.                     $exportData = new ExportDataObject();
  86.                     $serializer = new Serializer([new ObjectNormalizer()], [new JsonEncoder(), new XmlEncoder()]);
  87.                     $arrayData["dataObject"] = $exportData->getDataForObject($dataObject);
  88.                     $arrayData["arguments"] = $e->getArguments();
  89.                     $jsonContent $serializer->serialize($arrayData'json');
  90.                     foreach ($webHooks as $webHook) {
  91.                         $url $webHook->getURL();
  92.                         if(null == $url) {
  93.                             continue;
  94.                         }
  95.                         if ($webHook->getApikey() != null) {
  96.                             $apiKey $webHook->getApikey();
  97.                         } else if ($webHookApiKey \Pimcore\Model\WebsiteSetting::getByName('WebHookApi-key')){
  98.                             $apiKey $webHookApiKey->getData();
  99.                         } else {
  100.                             $apiKey "no-apy-key-found";
  101.                             $this->logger->error("Web Hook error: no api-key key found \nEvent: ".$eventName." Class: ".$entityType."\nhost: ".$webHook->getURL().['relatedObject' => $dataObject->getId()]);
  102.                             \Pimcore\Log\Simple::log("WebHook""No webHook api-key found");
  103.                         }
  104.                         if ($webHook->getPrivateKey() != null) {
  105.                             openssl_sign($jsonContent$signature$webHook->getPrivateKey(), OPENSSL_ALGO_SHA1);
  106.                             $signature base64_encode($signature);
  107.                             $usedPrivate "Use web hook private key";
  108.                         } else if ($webHookprivateKey \Pimcore\Model\WebsiteSetting::getByName('WebHookPrivateKey')){
  109.                             openssl_sign($jsonContent$signature$webHookprivateKey->getData(), OPENSSL_ALGO_SHA1);
  110.                             $signature base64_encode($signature);
  111.                             $usedPrivate "Use default private key";
  112.                         } else {
  113.                             $signature "no-private-key-found";
  114.                             $this->logger->error("Web Hook error: no private key found \nEvent: ".$eventName." Class: ".$entityType."\nhost: ".$webHook->getURL().['relatedObject' => $dataObject->getId()]);
  115.                             \Pimcore\Log\Simple::log("WebHook""No webHook private key found");
  116.                         }
  117.                         $client HttpClient::create();
  118.                         $method 'POST';
  119.                         $headers = ['Content-Type' => 'application/json',
  120.                                     "x-pimcore-listen-event" => $eventName,
  121.                                     "x-pimcore-object" => $entityType,
  122.                                     "x-pimcore-apikey" => $apiKey,
  123.                                     "x-pimcore-signature" => $signature,
  124.                                     "x-pimcore-used-private-key" => $usedPrivate
  125.                                 ];
  126.                         try {
  127.                             $response $client->request($method$url, ['headers' => $headers'body' => $jsonContent]);
  128.                             
  129.                             $messaggeData = array();
  130.                             $messaggeData['title'] = "WebHook Error";
  131.                             $messaggeData['message'] ="Web Hook request error:\nEvent: ".$eventName." Class: ".$entityType."\nhost: ".$webHook->getURL()."\nResponse: ".$response->getStatusCode();
  132.                             if ($response->getStatusCode() != 200) {
  133.                                 $this->sendNotification($messaggeData$dataObject->getUserModification());
  134.                             }
  135.                             if($response->getStatusCode() >=400 && $response->getStatusCode() <= 599) {
  136.                                 $this->logger->error($messaggeData['message'], ['relatedObject' => $dataObject->getId()]);
  137.                             }
  138.                             
  139.                             \Pimcore\Log\Simple::log("WebHook""Event: ".$eventName." Class: ".$entityType." object Id ".$dataObject->getId()." host: ".$webHook->getURL()." Response: ".$response->getStatusCode());
  140.                         } catch (\Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface $e){
  141.                             \Pimcore\Log\Simple::log("WebHook","Web Hook request error: Event: ".$eventName." Class: ".$entityType." object Id ".$dataObject->getId()." host: ".$webHook->getURL()." Response: ".$e->getMessage());
  142.                             $this->logger->error("Web Hook request error: \nEvent: ".$eventName." Class: ".$entityType."\nhost: ".$webHook->getURL()."\nResponse: ".$e->getMessage(), ['relatedObject' => $dataObject->getId()]);
  143.                         
  144.                             $messaggeData = array();
  145.                             $messaggeData['title'] = "WebHook Error: code ";
  146.                             $messaggeData['message'] ="Web Hook request error:\nEvent: ".$eventName." Class: ".$entityType."\nhost: ".$webHook->getURL()."\nResponse: ".$e->getMessage();
  147.                             $this->sendNotification($messaggeData$dataObject->getUserModification());
  148.                         
  149.                         }
  150.                     }
  151.                 }
  152.            }
  153.         }
  154.     }
  155.     public function sendNotification($messaggeData$userId=0) {
  156.         
  157.         $notificationService \Pimcore::getContainer()->get(NotificationService::class); 
  158.         $notificationService->sendToUser(
  159.             $userId,
  160.             0,
  161.             $messaggeData['title'],
  162.             $messaggeData['message'],
  163.         );
  164.     }
  165. }