Commit 89e1110d authored by Adriano Cori's avatar Adriano Cori Committed by Adriano
Browse files

Issue #3323767 by aronne: Add a data integrity layer

parent f99fa830
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -29,3 +29,8 @@ services:
    abstract: true
    class: Drupal\http_client_manager\Plugin\HttpServiceApiWrapper\HttpServiceApiWrapperBase
    arguments: [ '@http_client_manager.factory', '@cache.http_client_manager', '@current_user', '@language_manager', '@messenger' ]

  http_client_manager.subscriber:
    class: Drupal\http_client_manager\EventSubscriber\HttpClientManagerSubscriber
    tags:
      - { name: event_subscriber }
+85 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\http_client_manager\EventSubscriber;

use Drupal\http_client_manager\Event\HttpClientCallPreExecuteEvent;
use Drupal\http_client_manager\Event\HttpClientEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Class HttpClientManagerSubscriber.
 */
class HttpClientManagerSubscriber implements EventSubscriberInterface {

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    return [
      HttpClientEvents::CALL_PRE_EXECUTE => ['onDataIntegrityCheck'],
    ];
  }

  /**
   * This method is called whenever the http_client.call_pre_execute event is
   * dispatched.
   *
   * @param HttpClientCallPreExecuteEvent $event
   *   The Pre Execute event.
   */
  public function onDataIntegrityCheck(HttpClientCallPreExecuteEvent $event) {
    $client = $event->client;
    $command = $event->command;
    $needs_update = FALSE;
    $data = $command->toArray();
    $params = $client->getDescription()
      ->getOperation($command->getName())
      ->getParams();
    $excluded = [
      'array',
      'object',
      'resource',
    ];

    foreach ($params as $name => $param) {
      if (!isset($data[$name]) || !isset($params[$name])) {
        continue;
      }
      $value = $data[$name];
      $type = $params[$name]->getType();
      if (empty($type) || in_array($type, $excluded) || ($type == gettype($value))) {
        continue;
      }

      $needs_update = TRUE;
      switch ($type) {
        case 'int':
        case 'integer':
          $command[$name] = (int) $value;
          break;

        case 'float':
          $command[$name] = (float) $value;
          break;

        case 'number':
          $command[$name] = preg_match('/^\d+\.\d+$/', $value) ? (float) $value : (int) $value;
          break;

        case 'string':
          $command[$name] = (string) $value;
          break;

        case 'bool':
        case 'boolean':
          $command[$name] = (bool) $value;
          break;
      }
    }

    if ($needs_update) {
      $event->command = $command;
    }
  }

}