You are here

public function MatchingUnitIndex::processRequest in Booking and Availability Management API 8

Processes the request and returns an array of data as appropriate.

Parameters

\Symfony\Component\HttpFoundation\Request $request: The request object.

\Drupal\Core\Routing\RouteMatchInterface $route_match: The route match object.

\Symfony\Component\Serializer\SerializerInterface $serializer: The serializer. Some methods might require the plugin to leverage the serializer after extracting the request contents.

Return value

array The response.

Throws

\Symfony\Component\HttpKernel\Exception\HttpException

Overrides ServiceDefinitionInterface::processRequest

File

src/Plugin/ServiceDefinition/MatchingUnitIndex.php, line 111
Contains \Drupal\bat_api\Plugin\ServiceDefinition\MatchingUnitIndex.php

Class

MatchingUnitIndex
Plugin annotation @ServiceDefinition( id = "matching_unit_index", methods = { "GET" }, translatable = true, deriver = "\Drupal\bat_api\Plugin\Deriver\MatchingUnitIndex" )

Namespace

Drupal\bat_api\Plugin\ServiceDefinition

Code

public function processRequest(Request $request, RouteMatchInterface $route_match, SerializerInterface $serializer) {
  $unit_types = $request->query
    ->get('unit_types');
  $start_date = $request->query
    ->get('start_date');
  $end_date = $request->query
    ->get('end_date');
  $event_type = $request->query
    ->get('event_type');
  $event_states = $request->query
    ->get('event_states');
  if ($unit_types == 'all') {
    $unit_types = [];
    foreach (bat_unit_get_types() as $type => $info) {
      $unit_types[] = $type;
    }
  }
  else {
    $unit_types = array_filter(explode(',', $unit_types));
  }
  $states = array_filter(explode(',', $event_states));
  $events_json = [];

  // Get the event type definition from Drupal
  $bat_event_type = bat_event_type_load($event_type);
  $target_entity_type = $bat_event_type
    ->getTargetEntityType();

  // For each type of event create a state store and an event store
  $state_store = new DrupalDBStore($event_type, DrupalDBStore::BAT_STATE);
  $start_date_object = new \DateTime($start_date);
  $end_date_object = new \DateTime($end_date);
  $today = new \DateTime();
  if (!$this->currentUser
    ->hasPermission('view past event information') && $today > $start_date_object) {
    if ($today > $end_date_object) {
      return [];
    }
    $start_date_object = $today;
  }
  foreach ($unit_types as $unit_type) {
    $entities = $this
      ->getReferencedIds($unit_type);
    $childrens = [];
    $units = [];
    foreach ($entities as $entity) {
      $target_entity = $this->entityTypeManager
        ->getStorage($target_entity_type)
        ->load($entity['id']);
      $units[] = new Unit($entity['id'], $target_entity
        ->getEventDefaultValue($event_type));
    }
    if (!empty($units)) {
      $dates = [
        $end_date_object
          ->getTimestamp() => $end_date_object,
      ];
      $calendar = new Calendar($units, $state_store);
      $event_ids = $calendar
        ->getEvents($start_date_object, $end_date_object);
      foreach ($event_ids as $unit_id => $unit_events) {
        foreach ($unit_events as $key => $event) {
          $event_start_date = $event
            ->getStartDate();
          $dates[$event_start_date
            ->getTimestamp()] = $event_start_date;
        }
      }
      ksort($dates);
      $dates = array_values($dates);
      for ($i = 0; $i < count($dates) - 1; $i++) {
        $sd = $dates[$i];
        $ed = clone $dates[$i + 1];
        $ed
          ->sub(new \DateInterval('PT1M'));
        $response = $calendar
          ->getMatchingUnits($sd, $ed, $states, [], FALSE, FALSE);
        if (count(array_keys($response
          ->getIncluded()))) {
          $color = 'green';
        }
        else {
          $color = 'red';
        }
        $events_json[] = [
          'id' => $unit_type,
          'resourceId' => $unit_type,
          'start' => $sd
            ->format('Y-m-d') . 'T' . $sd
            ->format('H:i:00'),
          'end' => $ed
            ->format('Y-m-d') . 'T' . $ed
            ->format('H:i:00'),
          'color' => $color,
          'rendering' => 'background',
          'blocking' => 0,
          'title' => '',
        ];
      }
    }
  }
  $events_json = bat_api_merge_non_blocking_events($events_json);
  $context = array(
    'unit_types' => $unit_types,
    'start_date' => $start_date_object,
    'end_date' => $end_date_object,
    'event_type' => $event_type,
    'event_states' => $event_states,
  );
  $this->moduleHandler
    ->alter('bat_api_matching_units_calendar', $events_json, $context);
  return array_values($events_json);
}