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'],
];
}
}
