contacts_events-8.x-1.x-dev/modules/village_allocation/src/Plugin/rest/resource/VillagesResource.php

modules/village_allocation/src/Plugin/rest/resource/VillagesResource.php
<?php

namespace Drupal\village_allocation\Plugin\rest\resource;

use Drupal\contacts_events_villages\Entity\Village;
use Drupal\village_allocation\VillageAllocationQueries;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides bookings list.
 *
 * @RestResource(
 *   id = "village_allocation_villages",
 *   label = @Translation("Village Allocation Villages"),
 *   uri_paths = {
 *     "canonical" = "/admin/village_allocation/villages/{event_id}"
 *   }
 * )
 */
class VillagesResource extends ResourceBase {

  /**
   * Entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * Database.
   *
   * @var \Drupal\Core\Database\Connection
   */
  protected $db;

  /**
   * VA queries.
   *
   * @var \Drupal\village_allocation\VillageAllocationQueries
   */
  protected $queries;

  /**
   * {@inheritdoc}
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, array $serializer_formats, LoggerInterface $logger, EntityTypeManagerInterface $entity_type_manager, Connection $db, VillageAllocationQueries $queries) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger);
    $this->entityTypeManager = $entity_type_manager;
    $this->db = $db;
    $this->queries = $queries;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->getParameter('serializer.formats'),
      $container->get('logger.factory')->get('rest'),
      $container->get('entity_type.manager'),
      $container->get('database'),
      $container->get('village_allocation.queries')
    );
  }

  /**
   * Gets villages.
   *
   * @param string $event_id
   *   Event ID.
   *
   * @return \Drupal\rest\ResourceResponse
   *   Response containing serialized villages.
   */
  public function get($event_id) {
    // Load villages list.
    $villages = $this->queries->getVillagesInOrder($event_id);
    $results = [];

    // Project the results into a sensible format. Standard drupal entities
    // really don't represent well as JSON.
    /** @var \Drupal\contacts_events_villages\Entity\Village $village */
    foreach ($villages as $village) {
      $projection = [
        'id' => $village->id(),
        'name' => $village->getName(),
        'colour' => $village->get('colour')->value,
        'event' => $village->getEventId(),
        'fillValue' => (float) $village->get('fill_value')->value,
        'gate' => $village->get('gate')->value,
        'notes' => $village->get('notes')->value,
        'pitches' => (float) $village->get('pitches')->value,
        // pitches_allocated is a surrogate field added by getVillagesInorder.
        'pitchesAllocated' => $village->pitches_allocated,
        'specialRequirements' => $this->getSpecialRequirements($village),
      ];
      $results[] = $projection;
    }

    // Result of query is an associative array. We want non-associative
    // otherwise it'll be serialized as a JS object instead of a JS array.
    return (new ResourceResponse($results))
      ->addCacheableDependency([
        '#cache' => ['max-age' => 0],
      ]);
  }

  /**
   * Get special requirements.
   *
   * @param \Drupal\contacts_events_villages\Entity\Village $village
   *   The village to get special requirements for.
   *
   * @return array
   *   Array of arrays, where each child array contains keys name, id, icon.
   */
  private function getSpecialRequirements(Village $village) {
    $results = [];

    foreach ($village->get('special_requirements') as $requirement_item) {
      $requirement = $requirement_item->entity;
      /** @var \Drupal\taxonomy\Entity\Term $requirement */
      $results[] = [
        'name' => $requirement->getName(),
        'id' => $requirement->id(),
        'icon' => $requirement->get('icon')->value,
      ];
    }
    return $results;
  }

}

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

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