eventbrite_one_way_sync-1.0.0/modules/eventbrite_one_way_sync_node/src/Config/Config.php

modules/eventbrite_one_way_sync_node/src/Config/Config.php
<?php

namespace Drupal\eventbrite_one_way_sync_node\Config;

use Drupal\Component\Serialization\Json;
use Drupal\eventbrite_one_way_sync\Config\Config as BaseConfig;
use Drupal\eventbrite_one_way_sync\Utilities\Singleton;

/**
 * Wrapper around configuration.
 */
class Config extends BaseConfig implements ConfigInterface {

  use Singleton;

  /**
   * {@inheritdoc}
   */
  public function fieldMap(string $eventbrite_account_label) : array {
    $this->assertNonEmptyString($eventbrite_account_label, 'Eventbrite account label must be non-empty, for example default.');

    $mapping = $this->getFieldMapping();

    if (!array_key_exists($eventbrite_account_label, $mapping)) {
      throw new \Exception('The eventbrite account label ' . $eventbrite_account_label . ' does not exist in mapping. Available account labels are ' . Json::encode($mapping));
    }

    $this->checkNodeTypeAndFields(
      eventbrite_account_label: $eventbrite_account_label,
      node_type: $mapping[$eventbrite_account_label]['node_type'],
      eventbrite_id_field: $mapping[$eventbrite_account_label]['id_field'],
      eventbrite_struct_field: $mapping[$eventbrite_account_label]['struct_field'],
      eventbrite_date_field: $mapping[$eventbrite_account_label]['date_field'],
    );

    return $mapping[$eventbrite_account_label];
  }

  /**
   * Get a field mapping information line for an account.
   *
   * @param string $eventbrite_account_label
   *   An Eventbrite account such as "default".
   * @param string $item
   *   An item such as node_type or id_field.
   *
   * @return string
   *   The value.
   */
  public function fieldMapItem(string $eventbrite_account_label, string $item) {
    $this->assertNonEmptyString($eventbrite_account_label, 'Eventbrite account label must be non-empty, for example default.');
    $this->assertNonEmptyString($item, 'Item cannot be empty; try node_type or id_field.');

    $map = $this->fieldMap($eventbrite_account_label);

    if (empty($map[$item])) {
      throw new \Exception('map[' . $eventbrite_account_label . '][map][' . $item . '] cannot be empty.');
    }

    $candidate = $map[$item];

    return $candidate;
  }

  /**
   * {@inheritdoc}
   */
  public function nodeType(string $eventbrite_account_label) : string {
    return $this->fieldMapItem($eventbrite_account_label, 'node_type');
  }

  /**
   * {@inheritdoc}
   */
  public function idField(string $eventbrite_account_label) : string {
    return $this->fieldMapItem($eventbrite_account_label, 'id_field');
  }

  /**
   * {@inheritdoc}
   */
  public function dateField(string $eventbrite_account_label) : string {
    return $this->fieldMapItem($eventbrite_account_label, 'date_field');
  }

  /**
   * {@inheritdoc}
   */
  public function structField(string $eventbrite_account_label) : string {
    return $this->fieldMapItem($eventbrite_account_label, 'struct_field');
  }

  /**
   * {@inheritdoc}
   */
  public function checkNodeTypeAndFields(string $eventbrite_account_label, string $node_type = '', string $eventbrite_id_field = '', string $eventbrite_struct_field = '', $eventbrite_date_field = '') {
    $this->assertNonEmptyString($eventbrite_account_label, 'Label cannot be empty, it should be something like "default"');

    if (!$node_type) {
      $field_map = $this->fieldMap($eventbrite_account_label);

      $node_type = $field_map['node_type'];
      $eventbrite_id_field = $field_map['id_field'];
      $eventbrite_struct_field = $field_map['struct_field'];
      $eventbrite_date_field = $field_map['date_field'];
    }

    foreach ([
      'Node type' => [
        'var' => $node_type,
        'example' => 'event',
      ],
      'Eventbrite ID field' => [
        'var' => $eventbrite_id_field,
        'example' => 'field_eventbrite_id',
      ],
      'Eventbrite struct field' => [
        'var' => $eventbrite_struct_field,
        'example' => 'field_eventbrite_struct',
      ],
      'Eventbrite date field' => [
        'var' => $eventbrite_date_field,
        'example' => 'field_eventbrite_date',
      ],
    ] as $eventbrite_account_label => $info) {
      $this->assertNonEmptyString($info['var'], $eventbrite_account_label . ' cannot be empty. It can be something like ' . $info['example']);
      if ($info['var'] == 'NOT SET') {
        throw new \Exception($info['var'] . " cannot be NOT SET (that's the default value; you need to change it). It can be something like " . $info['example']);
      }
    }

    $this->assertNodeTypeExists($node_type);
    $this->assertFieldExists($eventbrite_id_field, $node_type);
    $this->assertFieldExists($eventbrite_struct_field, $node_type);
    $this->assertFieldExists($eventbrite_date_field, $node_type);
  }

  /**
   * {@inheritdoc}
   */
  public function assertNodeTypeExists(string $node_type) {
    $this->assertNonEmptyString($node_type, 'Node type cannot be empty, it should be something like "event" and it must exist.');

    $entityTypeManager = $this->entityTypeManager();

    if (!$entityTypeManager->getStorage('node_type')->load($node_type)) {
      throw new \Exception('Node type ' . $node_type . ' does not seem to exist, it should be something like "event" and it must exist.');
    }
  }

  /**
   * {@inheritdoc}
   */
  public function assertFieldExists(string $field_name, string $node_type) {
    $this->assertNonEmptyString($field_name, 'Field name cannot be empty, it should be something like field_xyz.');
    $this->assertNonEmptyString($node_type, 'Node type cannot be empty, it should be something like "event" and it must exist.');
    $fields = $this->entityFieldManager()->getFieldDefinitions('node', $node_type);
    if (!array_key_exists($field_name, $fields)) {
      throw new \Exception('We were expecting the field ' . $field_name . ' to exist in node type ' . $node_type . ', but it is not in ' . implode(', ', array_keys($fields)));
    }
  }

  /**
   * {@inheritdoc}
   */
  public function getFieldMapping() : array {
    $candidate = $this->configFactory()
      ->get('eventbrite_one_way_sync.versioned')
      ->get('mapping') ?: [];

    // For automated testing.
    $candidate[$this->selfTestDummyAccount()] = [
      'node_type' => 'event',
      'id_field' => 'field_eventbrite_id',
      'struct_field' => 'field_eventbrite_struct',
      'date_field' => 'field_eventbrite_date',
    ];

    $this->assertNonEmptyArray($candidate, 'The mapping in configuration (eventbrite_one_way_sync.versioned mapping) should be a non-empty array. If it is empty, this module will not do anything.');

    return $candidate;
  }

  /**
   * {@inheritdoc}
   */
  public function setNodeTypeAndFields(string $eventbrite_account_label, string $node_type, string $eventbrite_id_field, string $eventbrite_struct_field, string $eventbrite_date_field) {
    $this->checkNodeTypeAndFields(
      eventbrite_account_label: $eventbrite_account_label,
      node_type: $node_type,
      eventbrite_id_field: $eventbrite_id_field,
      eventbrite_struct_field: $eventbrite_struct_field,
      eventbrite_date_field: $eventbrite_date_field,
    );

    $mapping = $this->getFieldMapping();
    $mapping[$eventbrite_account_label] = [
      'node_type' => $node_type,
      'id_field' => $eventbrite_id_field,
      'struct_field' => $eventbrite_struct_field,
      'date_field' => $eventbrite_date_field,
    ];

    $this->setFieldMapping($mapping);
  }

  /**
   * {@inheritdoc}
   */
  public function deleteNodeTypeMapping(string $eventbrite_account_label) {
    $this->assertNonEmptyString($eventbrite_account_label, 'Label cannot be empty, it should be something like default.');

    $mapping = $this->getFieldMapping();
    unset($mapping[$eventbrite_account_label]);

    $this->setFieldMapping($mapping);
  }

  /**
   * {@inheritdoc}
   */
  public function setFieldMapping(array $mapping) {
    $config = $this->configFactory()
      ->getEditable('eventbrite_one_way_sync.versioned');
    $config->set('mapping', $mapping)->save();
  }

}

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

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