]> BookStack Code Mirror - bookstack/blob - app/Repos/PermissionsRepo.php
Merge branch 'custom_role_system'
[bookstack] / app / Repos / PermissionsRepo.php
1 <?php namespace BookStack\Repos;
2
3
4 use BookStack\Exceptions\PermissionsException;
5 use BookStack\Permission;
6 use BookStack\Role;
7 use Setting;
8
9 class PermissionsRepo
10 {
11
12     protected $permission;
13     protected $role;
14
15     /**
16      * PermissionsRepo constructor.
17      * @param $permission
18      * @param $role
19      */
20     public function __construct(Permission $permission, Role $role)
21     {
22         $this->permission = $permission;
23         $this->role = $role;
24     }
25
26     /**
27      * Get all the user roles from the system.
28      * @return \Illuminate\Database\Eloquent\Collection|static[]
29      */
30     public function getAllRoles()
31     {
32         return $this->role->all();
33     }
34
35     /**
36      * Get all the roles except for the provided one.
37      * @param Role $role
38      * @return mixed
39      */
40     public function getAllRolesExcept(Role $role)
41     {
42         return $this->role->where('id', '!=', $role->id)->get();
43     }
44
45     /**
46      * Get a role via its ID.
47      * @param $id
48      * @return mixed
49      */
50     public function getRoleById($id)
51     {
52         return $this->role->findOrFail($id);
53     }
54
55     /**
56      * Save a new role into the system.
57      * @param array $roleData
58      * @return Role
59      */
60     public function saveNewRole($roleData)
61     {
62         $role = $this->role->newInstance($roleData);
63         $role->name = str_replace(' ', '-', strtolower($roleData['display_name']));
64         // Prevent duplicate names
65         while ($this->role->where('name', '=', $role->name)->count() > 0) {
66             $role->name .= strtolower(str_random(2));
67         }
68         $role->save();
69
70         $permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : [];
71         $this->assignRolePermissions($role, $permissions);
72         return $role;
73     }
74
75     /**
76      * Updates an existing role.
77      * Ensure Admin role always has all permissions.
78      * @param $roleId
79      * @param $roleData
80      */
81     public function updateRole($roleId, $roleData)
82     {
83         $role = $this->role->findOrFail($roleId);
84         $permissions = isset($roleData['permissions']) ? array_keys($roleData['permissions']) : [];
85         $this->assignRolePermissions($role, $permissions);
86
87         if ($role->name === 'admin') {
88             $permissions = $this->permission->all()->pluck('id')->toArray();
89             $role->permissions()->sync($permissions);
90         }
91
92         $role->fill($roleData);
93         $role->save();
94     }
95
96     /**
97      * Assign an list of permission names to an role.
98      * @param Role $role
99      * @param array $permissionNameArray
100      */
101     public function assignRolePermissions(Role $role, $permissionNameArray = [])
102     {
103         $permissions = [];
104         $permissionNameArray = array_values($permissionNameArray);
105         if ($permissionNameArray && count($permissionNameArray) > 0) {
106             $permissions = $this->permission->whereIn('name', $permissionNameArray)->pluck('id')->toArray();
107         }
108         $role->permissions()->sync($permissions);
109     }
110
111     /**
112      * Delete a role from the system.
113      * Check it's not an admin role or set as default before deleting.
114      * If an migration Role ID is specified the users assign to the current role
115      * will be added to the role of the specified id.
116      * @param $roleId
117      * @param $migrateRoleId
118      * @throws PermissionsException
119      */
120     public function deleteRole($roleId, $migrateRoleId)
121     {
122         $role = $this->role->findOrFail($roleId);
123
124         // Prevent deleting admin role or default registration role.
125         if ($role->name === 'admin') {
126             throw new PermissionsException('The admin role cannot be deleted');
127         } else if ($role->id == Setting::get('registration-role')) {
128             throw new PermissionsException('This role cannot be deleted while set as the default registration role.');
129         }
130
131         if ($migrateRoleId) {
132             $newRole = $this->role->find($migrateRoleId);
133             if ($newRole) {
134                 $users = $role->users->pluck('id')->toArray();
135                 $newRole->users()->sync($users);
136             }
137         }
138
139         $role->delete();
140     }
141
142 }