implemented operation based permissions
This commit is contained in:
@@ -35,7 +35,14 @@ class ModuleManager
|
||||
*/
|
||||
public function list(bool $installedOnly = true, $enabledOnly = true): ModuleCollection
|
||||
{
|
||||
$modules = New ModuleCollection();
|
||||
$modules = New ModuleCollection();
|
||||
|
||||
// Always include core module
|
||||
$coreModule = $this->coreModule();
|
||||
if ($coreModule) {
|
||||
$modules['core'] = new ModuleObject($coreModule, null);
|
||||
}
|
||||
|
||||
// load all modules from store
|
||||
$entries = $this->repository->list();
|
||||
foreach ($entries as $entry) {
|
||||
@@ -497,4 +504,92 @@ class ModuleManager
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all available permissions from all modules
|
||||
*
|
||||
* @return array Grouped permissions with metadata
|
||||
*/
|
||||
public function availablePermissions(): array
|
||||
{
|
||||
$permissions = [];
|
||||
|
||||
foreach ($this->list() as $module) {
|
||||
$modulePermissions = $module->permissions();
|
||||
|
||||
foreach ($modulePermissions as $permission => $meta) {
|
||||
$permissions[$permission] = array_merge($meta, [
|
||||
'module' => $module->handle()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// Group by category
|
||||
$grouped = [];
|
||||
foreach ($permissions as $permission => $meta) {
|
||||
$group = $meta['group'] ?? 'Other';
|
||||
|
||||
if (!isset($grouped[$group])) {
|
||||
$grouped[$group] = [];
|
||||
}
|
||||
|
||||
$grouped[$group][$permission] = $meta;
|
||||
}
|
||||
|
||||
// Sort groups alphabetically
|
||||
ksort($grouped);
|
||||
|
||||
return $grouped;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate if a permission exists
|
||||
*/
|
||||
public function permissionExists(string $permission): bool
|
||||
{
|
||||
foreach ($this->list() as $module) {
|
||||
$modulePermissions = $module->permissions();
|
||||
|
||||
// Exact match
|
||||
if (isset($modulePermissions[$permission])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Wildcard match (e.g., user_manager.users.create matches user_manager.users.*)
|
||||
foreach (array_keys($modulePermissions) as $registered) {
|
||||
if (str_ends_with($registered, '.*')) {
|
||||
$prefix = substr($registered, 0, -2);
|
||||
if (str_starts_with($permission, $prefix . '.')) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
/**
|
||||
* Get the core module instance
|
||||
*/
|
||||
private function coreModule(): ?\KTXF\Module\ModuleInstanceInterface
|
||||
{
|
||||
if (isset($this->moduleInstances['core'])) {
|
||||
return $this->moduleInstances['core'];
|
||||
}
|
||||
|
||||
try {
|
||||
$coreModuleClass = \KTXC\Module\Module::class;
|
||||
if (!class_exists($coreModuleClass)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$instance = $this->container->get($coreModuleClass);
|
||||
$this->moduleInstances['core'] = $instance;
|
||||
return $instance;
|
||||
} catch (\Throwable $e) {
|
||||
$this->logger->error('Failed to load core module', [
|
||||
'error' => $e->getMessage()
|
||||
]);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user