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;
}
}
