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