permissions_repository-1.0.x-dev/src/Service/PermissionsRepository.php

src/Service/PermissionsRepository.php
<?php

declare(strict_types=1);

namespace Drupal\permissions_repository\Service;

use Drupal\Core\Utility\CallableResolver;

/**
 */
class PermissionsRepository implements PermissionsRepositoryInterface {
  private $data;

  public function __construct() {
    $this->data = [];
  }

  public function addPermission(string $provider, array $permission): void {
    if (empty($permission['title']) || empty($permission['key'])) {
      throw new \InvalidArgumentException('Invalid permission format: ' . json_encode($permission));
    }

    $permission += [
      'description' => NULL,
      'provider' => $provider,
      'weight' => 0,
      'extended_help' => '',
    ];

    $this->data[$provider]['permissions']['' . $permission['key']] = $permission;
  }

  public function addSection(string $provider, array $section): void {
    if (empty($section['title'])) {
      throw new \InvalidArgumentException('Invalid section format: ' . json_encode($section));
    }

    $section += [
      'description' => NULL,
      'provider' => $provider,
      'weight' => 0,
      'extended_help' => '',
    ];

    $this->data[$provider]['sections']['' . $section['title']] = $section;
  }

  public function setMain(string $provider, array $main): void {
    if (empty($main['extended_help'])) {
      throw new \InvalidArgumentException('Invalid main format: ' . json_encode($main));
    }

    $this->data[$provider]['main']['extended_help'] = $main['extended_help'];
  }

  public function sortAll(): void {
    foreach ($this->data as $provider => $items) {
      if (empty($items['permissions'])) {
        continue;
      }

      $sections = !empty($items['sections']) ? $items['sections'] : [];

      foreach ($items['permissions'] as $key => $permission) {
        $sectionWeight = 0;
        if (!empty($permission['section'])) {
          $sectionKey = $permission['section'];
          if (!empty($sections[$sectionKey]['weight'])) {
            $sectionWeight = 1000 * $sections[$sectionKey]['weight'];
          }
        }
        $this->data[$provider]['permissions'][$key]['overall_weight'] = $sectionWeight + ($permission['weight'] ?? 0);
      }

      if (!empty($this->data[$provider]['permissions'])) {
        uasort($this->data[$provider]['permissions'], function ($a, $b) {
          return $a['overall_weight'] <=> $b['overall_weight'];
        });
      }

      if (!empty($this->data[$provider]['sections'])) {
        uasort($this->data[$provider]['sections'], function ($a, $b) {
          return $a['weight'] <=> $b['weight'];
        });
      }
    }
  }

  public function getProviders(): array {
    return array_keys($this->data);
  }

  public function getAllPermissions(PermissionsRepositoryReturnStyle $style = PermissionsRepositoryReturnStyle::SectionArray): array {
    $ret = [];

    foreach ($this->data as $provider => $items) {
      if (!empty($items['permissions'])) {
        $temp = $items['permissions'];

        if ($style === PermissionsRepositoryReturnStyle::SectionArray) {
          $temp = $this->addSectionsToPermissions($provider, $temp);
        }
        $ret = array_merge($ret, $temp);
      }
    }

    return $ret;
  }

  public function getProviderData(string $provider, PermissionsRepositoryReturnStyle $style = PermissionsRepositoryReturnStyle::SectionArray): array {
    if (empty($this->data[$provider])) {
      return [];
    }

    $ret = $this->data[$provider];

    if ($style === PermissionsRepositoryReturnStyle::SectionArray) {
      $ret['permissions'] = $this->addSectionsToPermissions($provider, $ret['permissions']);
    }

    return $ret;
  }

  public function getAllData(PermissionsRepositoryReturnStyle $style = PermissionsRepositoryReturnStyle::SectionArray): array {
    if ($style === PermissionsRepositoryReturnStyle::SectionKey) {
      return $this->data;
    }

    $ret = $this->data;

    foreach ($ret as $provider => $items) {
      $ret[$provider]['permissions'] = $this->addSectionsToPermissions($provider, $items['permissions']);
    }

    return $ret;
  }

  protected function addSectionsToPermissions($provider, $permissions) {
    foreach ($permissions as $name => $permission) {
      if (!empty($permission['section'])) {
        $sectionKey = $permission['section'];
        if (!empty($this->data[$provider]['sections'][$sectionKey])) {
          $permissions[$name]['section'] = $this->data[$provider]['sections'][$sectionKey];
        }
      }
    }
    return $permissions;
  }

}

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

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