webhooks-8.x-1.x-dev/modules/webhook/src/EventSubscriber/WebhookSubscriber.php

modules/webhook/src/EventSubscriber/WebhookSubscriber.php
<?php

namespace Drupal\webhook\EventSubscriber;

use Adbar\Dot;
use Drupal\Core\Config\ConfigFactory;
use Drupal\Core\Entity\EntityFieldManager;
use Drupal\Core\Entity\EntityTypeBundleInfo;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\webhook\Entity\Webhook;
use Drupal\webhooks\Event\ReceiveEvent;
use Drupal\webhooks\Event\SendEvent;
use Drupal\webhooks\Event\WebhookEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Webhook event subscriber.
 */
class WebhookSubscriber implements EventSubscriberInterface {

  use StringTranslationTrait;

  /**
   * The entity type bundle info service.
   *
   * @var \Drupal\Core\Entity\EntityTypeBundleInfo
   */
  protected EntityTypeBundleInfo $entityTypeBundleInfo;

  /**
   * The entity field manager service.
   *
   * @var \Drupal\Core\Entity\EntityFieldManager
   */
  protected EntityFieldManager $entityFieldManager;

  /**
   * The config factory service.
   *
   * @var \Drupal\Core\Config\ConfigFactory
   */
  private ConfigFactory $configFactory;

  /**
   * Constructs event subscriber.
   *
   * @param \Drupal\Core\Entity\EntityTypeBundleInfo $entity_type_bundle_info
   *   The entity type bundle info service.
   * @param \Drupal\Core\Entity\EntityFieldManager $entity_field_manager
   *   The entity field manager service.
   * @param \Drupal\Core\Config\ConfigFactory $config_factory
   *   The config factory service.
   */
  public function __construct(
    EntityTypeBundleInfo $entity_type_bundle_info,
    EntityFieldManager $entity_field_manager,
    ConfigFactory $config_factory,
  ) {
    $this->entityTypeBundleInfo = $entity_type_bundle_info;
    $this->entityFieldManager = $entity_field_manager;
    $this->configFactory = $config_factory;
  }

  /**
   * Webhook send event handler.
   *
   * @param \Drupal\webhooks\Event\SendEvent $event
   *   Response event.
   */
  public function onWebhookSend(SendEvent $event) {
  }

  /**
   * Webhook receive event handler.
   *
   * @param \Drupal\webhooks\Event\ReceiveEvent $event
   *   Response event.
   *
   * @throws \Drupal\Core\Entity\EntityStorageException
   */
  public function onWebhookReceive(ReceiveEvent $event) {
    $bundle_info = $this->entityTypeBundleInfo->getBundleInfo('webhook');
    $webhook_type = isset($bundle_info[$event->getWebhookConfig()->id()]) ? $event->getWebhookConfig()->id() : 'webhook';
    $dots = new Dot([
      'headers' => $event->getWebhook()->getHeaders(),
      'payload' => $event->getWebhook()->getPayload(),
    ]);
    $mapping = $this->configFactory->get('webhook.mappings.' . $webhook_type)->get('mapping');
    $fields = $this->entityFieldManager->getFieldDefinitions('webhook', $webhook_type);
    $field_data = [];
    foreach ($mapping as $field_name => $identifier) {
      if (isset($fields[$field_name]) && $dots->has($identifier)) {
        $field_data[$field_name] = $dots->get($identifier);
      }
    }
    $values = $field_data + [
      'bundle' => $webhook_type,
      'label' => $this->t('Webhook @uuid', ['@uuid' => $event->getWebhook()->getUuid()]),
      'headers' => json_encode($event->getWebhook()->getHeaders()),
      'payload' => json_encode($event->getWebhook()->getPayload()),
      'created' => time(),
    ];
    $webhook = Webhook::create($values);
    $webhook->save();
  }

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents(): array {
    return [
      WebhookEvents::SEND => ['onWebhookSend'],
      WebhookEvents::RECEIVE => ['onWebhookReceive'],
    ];
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc