public function ajaxUpdate()

in modules/quanthub_core/src/Controller/QuanthubCalendarController.php [62:158]


  public function ajaxUpdate(Request $request) {
    $queryArgs = $request->query->all();
    $langcode = $this->languageManager->getCurrentLanguage()->getId();

    // Get query parameters from the request.
    $start = $request->query->get('start');
    $end = $request->query->get('end');

    $timezone = $request->query->get('timeZone');
    // @todo remove when postgres version will be 15>=.
    if ($timezone == 'Europe/Kyiv') {
      $timezone = 'Europe/Kiev';
    }

    $start_date = new DrupalDateTime($start, new \DateTimeZone($timezone));
    $end_date = new DrupalDateTime($end, new \DateTimeZone($timezone));

    $interval = $end_date->diff($start_date);

    if ($interval->m < 2) {
      // Format the dates (optional).
      $start_formatted = $start_date->getTimestamp();
      $end_formatted = $end_date->getTimestamp();

      $query = $this->database
        ->select('node_field_data', 'n')
        ->fields('n', ['title']);

      $query->join('node__field_release_date', 'nfrd', 'nfrd.entity_id = n.nid AND nfrd.langcode = :langcode', [':langcode' => $langcode]);
      $query->join('node__field_rich_brief_descr', 'nrbd', 'nrbd.entity_id = n.nid AND nfrd.langcode = :langcode', [':langcode' => $langcode]);
      $query->join('path_alias', 'pa', "pa.path = CONCAT('/node/', n.nid) AND nfrd.langcode = :langcode", [':langcode' => $langcode]);
      $query->leftJoin('node__field_release_type', 'nfrt', 'nfrt.entity_id = n.nid AND nfrd.langcode = :langcode', [':langcode' => $langcode]);

      $query->condition('n.type', 'release');
      $query->condition('n.langcode', $langcode);
      $query->condition('n.status', TRUE);
      $query->condition('nfrd.field_release_date_value', $start_formatted, '>=');
      $query->condition('nfrd.field_release_date_end_value', $end_formatted, '<=');

      $query->addField('n', 'nid', 'eid');
      $query->addField('n', 'nid', 'id');
      $query->addField('nrbd', 'field_rich_brief_descr_value', 'des');
      $query->addExpression("TO_CHAR(to_timestamp(nfrd.field_release_date_value) AT TIME ZONE :timezone, 'YYYY-MM-DD\"T\"HH24:MI:SS')", 'start', [':timezone' => $timezone]);
      $query->addExpression("CONCAT('/', pa.langcode, pa.alias)", 'url');
      $query->addExpression("TO_CHAR(to_timestamp(nfrd.field_release_date_end_value) AT TIME ZONE :timezone, 'YYYY-MM-DD\"T\"HH24:MI:SS')", 'end', [':timezone' => $timezone]);
      $query->addExpression("FALSE", 'eventDurationEditable');
      $query->addExpression("CASE nfrt.field_release_type_value
        WHEN 'dataset' THEN '#0B8043'
        WHEN 'press_release' THEN '#3F51B5'
        WHEN 'announcement' THEN '#CC2E4F'
        WHEN 'report_submission' THEN '#83226D'
        WHEN 'other' THEN '#616161'
        ELSE '#616161' END",
        'backgroundColor'
      );
      $query->addExpression("CASE WHEN
        TO_CHAR(to_timestamp(nfrd.field_release_date_value) AT TIME ZONE :timezone, 'HH24:MI') = '00:00'
        THEN 1
        ELSE 0 END",
        'allDay',
        [':timezone' => $timezone]
      );
      $data = $query->execute()->fetchAll();

      // Fullcalendar.js need this value as bool.
      foreach ($data as $key => $value) {
        if ($data[$key]->allDay == FALSE) {
          $data[$key]->allDay = FALSE;
        }
        else {
          $data[$key]->allDay = TRUE;
        }
      }

      $response = new CacheableJsonResponse($data);

      // Create a CacheableMetadata object to hold cacheability metadata.
      $cacheableMetadata = new CacheableMetadata();

      if (isset($queryArgs['start'])) {
        $cacheableMetadata->addCacheContexts([
          'url.query_args:start',
          'url.query_args:end',
          'url.query_args:timeZone',
          'languages:language_interface',
        ]);
        $cacheableMetadata->addCacheTags(['node_list:release']);
        $response->addCacheableDependency($cacheableMetadata);
      }

    }
    else {
      $response = new JsonResponse([]);
    }

    return $response;
  }