drupalorg-1.0.x-dev/src/Controller/DrupalOrgController.php

src/Controller/DrupalOrgController.php
<?php

namespace Drupal\drupalorg\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\drupalorg\ProjectService;
use Drupal\drupalorg\UserService;
use Drupal\node\Entity\Node;
use Drupal\user\Entity\User;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;

/**
 * Generic routes.
 */
class DrupalOrgController extends ControllerBase {

  /**
   * Construct method.
   *
   * @param \Drupal\drupalorg\UserService $userService
   *   User service from drupalorg module.
   * @param \Drupal\drupalorg\ProjectService $projectService
   *   Project service from drupalorg module.
   */
  public function __construct(
    #[Autowire(service: 'drupalorg.user_service')]
    protected UserService $userService,
    #[Autowire(service: 'drupalorg.project_service')]
    protected ProjectService $projectService,
  ) {
  }

  /**
   * Returns project maintainers data for the given parameters.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The current request.
   *
   * @return \Symfony\Component\HttpFoundation\JsonResponse
   *   A array with the information.
   */
  public function projectUsage(Request $request): JsonResponse {
    $data = [];
    $nid = (int) $request->query->get('nid');
    if (!$nid) {
      $data['error'] = $this->t('nid is required.');
    }
    else {
      $weeks = (int) $request->query->get('weeks_ago');
      $weeks = $weeks ? strtotime(($weeks + 1) . ' weeks ago') : NULL;
      $node = Node::load($nid);
      if (!$node) {
        $data['error'] = $this->t('nid is not a valid node.');
      }
      elseif (!$this->projectService->isProject($node)) {
        $data['error'] = $this->t('nid is not a valid project.');
      }
      else {
        $data['usage'] = $this->projectService->getTotalUsage($node, FALSE, $weeks);
      }
    }

    $data['success'] = empty($data['error']);
    return new JsonResponse($data);
  }

  /**
   * Redirects /i/NID to /node/NID.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The current request.
   * @param string $node_id
   *   A node ID. No processing or validation is done.
   *
   * @return \Symfony\Component\HttpFoundation\RedirectResponse
   *   A redirect.
   */
  public function issueShortcutRedirect(Request $request, string $node_id): RedirectResponse {
    if (is_numeric($node_id)) {
      return new RedirectResponse('/node/' . $node_id);
    }

    $this->messenger()->addWarning($this->t('The node ID given is not numeric.'));
    return $this->redirect('<front>');
  }

  /**
   * Returns project maintainers data for the given parameters.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The current request.
   *
   * @return \Symfony\Component\HttpFoundation\JsonResponse
   *   A array with the information.
   */
  public function projectMaintainers(Request $request): JsonResponse {
    $data = [];
    $uid = (int) $request->query->get('uid');
    $nid = (int) $request->query->get('nid');
    if (!$uid && !$nid) {
      $data['error'] = $this->t('uid or nid are required.');
    }
    elseif ($uid && $nid) {
      $data['error'] = $this->t('uid and nid cannot be combined.');
    }
    else {
      if ($nid) {
        $node = Node::load($nid);
        if (!$node) {
          $data['error'] = $this->t('nid is not a valid node.');
        }
        elseif (!$this->projectService->isProject($node)) {
          $data['error'] = $this->t('nid is not a valid project.');
        }
        else {
          $maintainers = $this->projectService->getProjectMaintainers($node);
          $users = User::loadMultiple(array_keys($maintainers));
          $data['maintainers'] = [];
          foreach ($users as $user) {
            $data['maintainers'][$user->id()] = [
              'name' => $user->getAccountName(),
              'permissions' => $this->getPermissionsArray($maintainers, $user->id()),
            ];
          }
        }
      }
      else {
        $user = User::load($uid);
        if (!$user) {
          $data['error'] = $this->t('uid is not a valid user.');
        }
        else {
          if ($user->isBlocked()) {
            $data['error'] = $this->t('uid is not a valid user.');
          }
          else {
            $projects = $this->userService->getProjectMaintained($user);
            $project_nodes = Node::loadMultiple(array_keys($projects));
            $data['projects'] = [];
            foreach ($project_nodes as $project) {
              if ($this->projectService->isProject($project)) {
                $data['projects'][$project->id()] = [
                  'name' => $project->get('field_project_machine_name')->value,
                  'permissions' => $this->getPermissionsArray($projects, $project->id()),
                ];
              }
            }
          }
        }
      }
    }

    $data['success'] = empty($data['error']);
    return new JsonResponse($data);
  }

  /**
   * Returns the permissions array for a given key within the list.
   *
   * @param array $list
   *   Full list of maintainer permissions.
   * @param string $key
   *   Key to check within the array.
   *
   * @return array
   *   Cleaned up permission array.
   */
  protected function getPermissionsArray(array $list, $key): array {
    if (empty($list[$key])) {
      return [];
    }

    $permissions = (array) $list[$key];
    unset($permissions['nid']);
    unset($permissions['uid']);

    return $permissions;
  }

}

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

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