View source
<?php
namespace Drupal\webhooks\Controller;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Link;
use Drupal\Core\Logger\LoggerChannelFactoryInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;
use Drupal\webhooks\Exception\WebhookIncomingEndpointNotFoundException;
use Drupal\webhooks\Exception\WebhookMismatchSignatureException;
use Drupal\webhooks\WebhooksService;
use GuzzleHttp\Psr7\Response;
use Symfony\Component\DependencyInjection\ContainerInterface;
class WebhookController extends ControllerBase {
protected $webhooksService;
protected $entityTypeManager;
protected $logger;
protected $messenger;
public function __construct(WebhooksService $webhooks_service, EntityTypeManagerInterface $entity_type_manager, LoggerChannelFactoryInterface $logger_factory, MessengerInterface $messenger) {
$this->webhooksService = $webhooks_service;
$this->entityTypeManager = $entity_type_manager;
$this->logger = $logger_factory
->get('webhooks');
$this->messenger = $messenger;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('webhooks.service'), $container
->get('entity_type.manager'), $container
->get('logger.factory'), $container
->get('messenger'));
}
public function receive($incoming_webhook_name) {
try {
$this->webhooksService
->receive($incoming_webhook_name);
} catch (WebhookIncomingEndpointNotFoundException $e) {
$this->logger
->error($e
->getMessage());
return new Response(404, [], $e
->getMessage());
} catch (WebhookMismatchSignatureException $e) {
$this->logger
->error('Unauthorized. Signature mismatch for Webhook Subscriber %name: @message', [
'%name' => $incoming_webhook_name,
'@message' => $e
->getMessage(),
'link' => Link::createFromRoute($this
->t('Edit Webhook'), 'entity.webhook_config.edit_form', [
'webhook_config' => $incoming_webhook_name,
])
->toString(),
]);
return new Response(401, [], $e
->getMessage());
}
$this->logger
->info('Received a Webhook: %name', [
'%name' => $incoming_webhook_name,
'link' => Link::createFromRoute($this
->t('Edit Webhook'), 'entity.webhook_config.edit_form', [
'webhook_config' => $incoming_webhook_name,
])
->toString(),
]);
return new Response(200, [], 'OK');
}
public function access(AccountInterface $account) {
return AccessResult::allowed();
}
public function toggleActive($id) {
$webhooks_storage = $this->entityTypeManager
->getStorage('webhook_config');
$webhook_config = $webhooks_storage
->load($id);
$webhook_config
->setStatus(!$webhook_config
->status());
$webhook_config
->save();
$this
->messenger()
->addStatus($this
->t('Webhook <a href=":url">@webhook</a> has been %status.', [
':url' => Url::fromRoute('entity.webhook_config.edit_form', [
'webhook_config' => $webhook_config
->getId(),
])
->toString(),
'@webhook' => $webhook_config
->getLabel(),
'%status' => $webhook_config
->status() ? 'enabled' : 'disabled',
]));
return $this
->redirect("entity.webhook_config.collection");
}
}