Skip to content

Commit 79f6255

Browse files
committed
GraphQL and Rest role permissions
1 parent a13e0fd commit 79f6255

File tree

6 files changed

+240
-73
lines changed

6 files changed

+240
-73
lines changed

admin/controller/admin/role.php

+70-9
Original file line numberDiff line numberDiff line change
@@ -25,27 +25,75 @@
2525
use function Vvveb\__;
2626
use Vvveb\Controller\Base;
2727
use Vvveb\Sql\RoleSQL;
28+
use Vvveb\System\Cache;
2829
use Vvveb\System\User\Role as RoleList;
2930

3031
class Role extends Base {
3132
protected $type = 'role';
3233

34+
protected $app = 'admin';
35+
36+
protected $apps = [
37+
'admin' => ['permissions' => ['controllers']],
38+
'rest' => ['permissions' => ['routes', 'controllers']],
39+
'graphql' => ['permissions' => ['controllers', 'models']],
40+
];
41+
42+
function init() {
43+
$this->app = $this->request->get['app'] ?? 'admin';
44+
45+
if (! isset($this->apps[$this->app])) {
46+
//$this->view->errors[] = __('Invalid app!');
47+
return $this->notFound(__('Invalid app!'));
48+
}
49+
50+
parent::init();
51+
}
52+
3353
function index() {
3454
$role_id = $this->request->get['role_id'] ?? false;
3555

36-
$tree = [];
37-
RoleList::mkmap(DIR_APP . 'controller', $tree);
38-
$this->view->tree = $tree['controller'];
56+
$cache = Cache::getInstance();
57+
$tree = $cache->cache(APP, $this->app . '-permissions',function () {
58+
$tree = [];
59+
//$this->view->tree = RoleList::controllers($this->app);
60+
foreach ($this->apps[$this->app]['permissions'] as $method) {
61+
$data = RoleList::$method($this->app);
62+
63+
if ($data) {
64+
$tree += RoleList::$method($this->app);
65+
}
66+
////$this->view->tree = $tree['controller'];
67+
}
3968

40-
$controllers = RoleList::getControllerList();
41-
$this->view->controllers = $controllers;
42-
$this->view->capabilities = RoleList::getCapabilitiesList();
69+
return $tree;
70+
}, 259200);
71+
72+
$this->view->tree = $tree;
73+
74+
//\Vvveb\dd($this->view->tree);
75+
76+
//$this->view->controllers = RoleList::getControllerList($this->app);
77+
$this->view->capabilities = RoleList::getCapabilitiesList($this->app);
78+
$this->view->apps = $this->apps;
79+
$this->view->app = $this->app;
4380

4481
$role = new RoleSQL();
4582
$this->view->role = $role->get(['role_id' => $role_id]);
4683

4784
if ($this->view->role) {
48-
$this->view->role['permissions'] = json_decode($this->view->role['permissions'], true);
85+
$permissions = json_decode($this->view->role['permissions'], true);
86+
87+
if (isset($permissions[$this->app])) {
88+
$permissions = $permissions[$this->app];
89+
} else {
90+
//backward compatibility for admin app
91+
if ($this->app !== 'admin') {
92+
$permissions = [];
93+
}
94+
}
95+
96+
$this->view->role['permissions'] = $permissions;
4997
$this->view->role['permissions']['deny'] = $this->view->role['permissions']['deny'] ?? [];
5098
$this->view->role['permissions']['allow'] = $this->view->role['permissions']['allow'] ?? [];
5199
$this->view->role['permissions']['capabilities'] = $this->view->role['permissions']['capabilities'] ?? [];
@@ -57,11 +105,24 @@ function save() {
57105
$allow = $this->request->post['allow'] ?? [];
58106
$deny = $this->request->post['deny'] ?? [];
59107
$capabilities = $this->request->post['capabilities'] ?? [];
60-
$permissions = ['deny' => $deny, 'allow' => $allow, 'capabilities' => $capabilities];
108+
$permissions = [$this->app => ['deny' => $deny, 'allow' => $allow, 'capabilities' => $capabilities]];
61109

62110
$role_id = $this->request->get['role_id'] ?? false;
63111

64-
$role = new RoleSQL();
112+
$role = new RoleSQL();
113+
$this->view->role = $role->get(['role_id' => $role_id]);
114+
$currentPermissions = json_decode($this->view->role['permissions'], true);
115+
116+
if ($currentPermissions) {
117+
//backward compatibility
118+
if (isset($currentPermissions['allow'])) {
119+
$currentPermissions['admin'] = $currentPermissions;
120+
unset($currentPermissions['allow'], $currentPermissions['deny'], $currentPermissions['capabilities']);
121+
}
122+
123+
$currentPermissions[$this->app] = $permissions[$this->app];
124+
$permissions = $currentPermissions;
125+
}
65126

66127
if ($role_id) {
67128
$result = $role->edit(['role_id' => $role_id, 'role' => $data + ['permissions' => json_encode($permissions)]]);

admin/controller/admin/roles.php

+7-15
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,16 @@
2222

2323
namespace Vvveb\Controller\Admin;
2424

25-
use Vvveb\Controller\Base;
25+
use Vvveb\Controller\Listing;
2626

27-
class Roles extends Base {
28-
private function save() {
29-
}
27+
class Roles extends Listing {
28+
protected $type = 'role';
3029

31-
function index() {
32-
$view = $this->view;
33-
$roles = new \Vvveb\Sql\RoleSQL();
30+
protected $controller = 'role';
3431

35-
$options = [
36-
'type' => 'admin', //$this->type,
37-
] + $this->global;
32+
protected $listController = 'roles';
3833

39-
$results = $roles->getAll($options);
34+
protected $list = 'role';
4035

41-
$view->roles = $results['role'];
42-
$view->count = $results['count'];
43-
$view->limit = $options['limit'];
44-
}
36+
protected $module = 'admin';
4537
}

admin/template/admin/role.tpl

+32-2
Original file line numberDiff line numberDiff line change
@@ -85,13 +85,24 @@ if ($tree) {
8585
foreach($parent as $id => $permission) {
8686
$uniq = Vvveb\System\Functions\Str::random(5);
8787
$hasChildren = is_array($permission) && count($permission);
88+
$rule = $path . ($path && $id != 'index' ? '/' : '') . ($id != 'index' ? $id : '') . ($hasChildren ? '/*' : '');
8889
?>
8990
//catch all data attributes
9091
@permission [data-v-permission-*] = $permission['@@__data-v-permission-(*)__@@']
9192
@permission [data-v-name] = $id
92-
@permission input[type="hidden"] = <?php echo ($path ? $path . '/' : $path) . $id;?>
93+
@permission [data-v-rule] = $rule
94+
@permission [data-v-name]|addClass = <?php
95+
if ($this->app == 'rest' && !$hasChildren) {
96+
if ($id == 'get') echo 'badge bg-success';
97+
if ($id == 'post') echo 'badge bg-primary';
98+
if ($id == 'put') echo 'badge bg-warning';
99+
if ($id == 'patch') echo 'badge bg-info';
100+
if ($id == 'delete') echo 'badge bg-danger';
101+
}
102+
?>
103+
@permission input[type="hidden"] = <?php echo $rule;?>
93104
@permission input[type="checkbox"]|id = $uniq
94-
@permission|class = <?php if ($hasChildren) echo 'folder'; else 'file';?>
105+
@permission|class = <?php if ($hasChildren) echo 'folder'; else echo 'file';?>
95106

96107

97108
@permission|append = <?php
@@ -127,3 +138,22 @@ if(isset($this->capabilities) && is_array($this->capabilities)) {
127138
@capability|after = <?php
128139
}
129140
}?>
141+
142+
143+
@app = [data-v-apps] [data-v-app]
144+
@app|deleteAllButFirstChild
145+
146+
@app|before = <?php
147+
if(isset($this->apps) && is_array($this->apps)) {
148+
foreach ($this->apps as $app => $options) {?>
149+
150+
151+
@app [data-v-app-url]|innerText = $app
152+
@app a[data-v-app-url]|href = <?php echo Vvveb\url('', ['app' => $app]);?>
153+
@app [data-v-app-url]|addClass = <?php
154+
if ($this->app == $app) echo 'active';
155+
?>
156+
157+
@app|after = <?php
158+
}
159+
}?>

admin/template/admin/roles.tpl

+1-16
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,2 @@
1-
import(common.tpl)
2-
import(pagination.tpl)
1+
import(listing.tpl, {"type":"role", "list": "roles"})
32

4-
[data-v-roles] [data-v-role]|deleteAllButFirstChild
5-
6-
[data-v-roles] [data-v-role]|before = <?php
7-
if(isset($this->roles) && is_array($this->roles)) {
8-
//$pagination = $this->roles[$_roles_idx]['pagination'];
9-
foreach ($this->roles as $index => $role) {?>
10-
11-
[data-v-roles] [data-v-role] [data-v-role-url]|href = <?php echo Vvveb\url(['module' => 'admin/role', 'role_id' => $role['role_id']]);?>
12-
13-
[data-v-roles] [data-v-role] [data-v-*]|innerText = $role['@@__data-v-(*)__@@']
14-
15-
[data-v-roles] [data-v-role]|after = <?php
16-
}
17-
}?>

system/user/admin.php

+10-6
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,9 @@
2222

2323
namespace Vvveb\System\User;
2424

25+
use function Vvveb\session as sess;
2526
use Vvveb\Sql\AdminSQL;
2627
use Vvveb\System\PageCache;
27-
use function Vvveb\session as sess;
28-
2928

3029
class Admin extends Auth {
3130
private static $namespace = 'admin';
@@ -61,9 +60,9 @@ public static function add($data) {
6160
return $admin->add([self :: $namespace => $data]);
6261
}
6362

64-
public static function hasCapability($capability) {
63+
public static function hasCapability($capability, $app = APP) {
6564
$admin = sess(self :: $namespace, false);
66-
$capabilities = $admin['permissions']['capabilities'] ?? [];
65+
$capabilities = $admin['permissions'][$app]['capabilities'] ?? $admin['permissions']['capabilities'] ?? [];
6766

6867
return in_array($capability, $capabilities);
6968
}
@@ -81,9 +80,14 @@ public static function hasSiteAccess($site_id) {
8180
return in_array($site_id, $site_access);
8281
}
8382

84-
public static function hasPermission($permission) {
83+
public static function hasPermission($permission, $app = APP) {
8584
$admin = sess(self :: $namespace, false);
86-
$permissions = $admin['permissions'] ?: [];
85+
86+
if (! $admin) {
87+
return false;
88+
}
89+
90+
$permissions = ($admin['permissions'][$app] ?? $admin['permissions']) ?: [];
8791
$allow = $permissions['allow'] ?? [];
8892
$deny = $permissions['deny'] ?? [];
8993

0 commit comments

Comments
 (0)