brandfolder-8.x-1.x-dev/src/Controller/IncomingWebhookController.php

src/Controller/IncomingWebhookController.php
<?php

namespace Drupal\brandfolder\Controller;

use Drupal\Core\Access\AccessResultInterface;
use Drupal\brandfolder\Event\BrandfolderWebhookEvent;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Routing\Access\AccessInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Drupal\Component\Serialization\Json;

/**
 * Handle incoming Brandfolder webhook requests/events.
 */
class IncomingWebhookController extends ControllerBase implements AccessInterface {

  /**
   * Valid event types.
   *
   * @var array $valid_event_types
   */
  protected $valid_event_types = [
    'asset.create',
    'asset.update',
    'asset.delete',
  ];

  /**
   * Access management. Block requests that are blatantly invalid.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *
   * @return \Drupal\Core\Access\AccessResultInterface
   *   The access result.
   */
  public function access(Request $request): AccessResultInterface {
    $valid_payload = FALSE;
    $payload = json_decode($request->getContent(), TRUE);
    if (isset($payload['data']['attributes'])) {
      $data = $payload['data']['attributes'];
      $event_type = $data['event_type'];
      if (in_array($event_type, $this->valid_event_types)) {
        if (isset($data['key']) && is_string($data['key']) && strlen($data['key']) > 0) {
          $valid_payload = TRUE;
        }
      }
    }

    return AccessResult::allowedIf($valid_payload);
  }

  /**
   * Handle incoming webhooks.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *
   * @return \Symfony\Component\HttpFoundation\Response
   */
  public function webhookListener(Request $request) {
    $payload = json_decode($request->getContent(), TRUE);
    $is_request_valid = isset($payload['data']['attributes']);

    $bf_config = \Drupal::config('brandfolder.settings');
    if ($bf_config->get('verbose_log_mode')) {
      $logger = \Drupal::logger('brandfolder');
      $logger->debug('Brandfolder webhook received. It looks like {validity} request. Payload: {payload}', [
        'validity' => $is_request_valid ? 'a valid' : 'an invalid',
        'payload' => Json::encode($payload),
      ]);
    }

    if ($is_request_valid) {
      $bf_event_type = $payload['data']['attributes']['event_type'];
      // Fire/dispatch events so Drupal modules can act on this webhook.
      $dispatcher = \Drupal::service('event_dispatcher');
      $dispatcher->dispatch(new BrandfolderWebhookEvent($payload['data']), $bf_event_type);
    }

    return new Response($this->t('Webhook handling complete.'), Response::HTTP_OK);
  }

}

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

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