]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/RoleController.php
Refactored common list handling operations to new class
[bookstack] / app / Http / Controllers / RoleController.php
1 <?php
2
3 namespace BookStack\Http\Controllers;
4
5 use BookStack\Auth\Permissions\PermissionsRepo;
6 use BookStack\Auth\Queries\RolesAllPaginatedAndSorted;
7 use BookStack\Auth\Role;
8 use BookStack\Exceptions\PermissionsException;
9 use BookStack\Util\SimpleListOptions;
10 use Exception;
11 use Illuminate\Http\Request;
12 use Illuminate\Validation\ValidationException;
13
14 class RoleController extends Controller
15 {
16     protected PermissionsRepo $permissionsRepo;
17
18     public function __construct(PermissionsRepo $permissionsRepo)
19     {
20         $this->permissionsRepo = $permissionsRepo;
21     }
22
23     /**
24      * Show a listing of the roles in the system.
25      */
26     public function index(Request $request)
27     {
28         $this->checkPermission('user-roles-manage');
29
30         $listOptions = SimpleListOptions::fromRequest($request, 'roles')->withSortOptions([
31             'display_name' => trans('common.sort_name'),
32             'users_count' => trans('settings.roles_assigned_users'),
33             'permissions_count' => trans('settings.roles_permissions_provided'),
34             'created_at' => trans('common.sort_created_at'),
35             'updated_at' => trans('common.sort_updated_at'),
36         ]);
37
38         $roles = (new RolesAllPaginatedAndSorted())->run(20, $listOptions);
39         $roles->appends($listOptions->getPaginationAppends());
40
41         $this->setPageTitle(trans('settings.roles'));
42
43         return view('settings.roles.index', [
44             'roles'       => $roles,
45             'listOptions' => $listOptions,
46         ]);
47     }
48
49     /**
50      * Show the form to create a new role.
51      */
52     public function create(Request $request)
53     {
54         $this->checkPermission('user-roles-manage');
55
56         /** @var ?Role $role */
57         $role = null;
58         if ($request->has('copy_from')) {
59             $role = Role::query()->find($request->get('copy_from'));
60         }
61
62         if ($role) {
63             $role->display_name .= ' (' . trans('common.copy') . ')';
64         }
65
66         $this->setPageTitle(trans('settings.role_create'));
67
68         return view('settings.roles.create', ['role' => $role]);
69     }
70
71     /**
72      * Store a new role in the system.
73      */
74     public function store(Request $request)
75     {
76         $this->checkPermission('user-roles-manage');
77         $this->validate($request, [
78             'display_name' => ['required', 'min:3', 'max:180'],
79             'description'  => ['max:180'],
80         ]);
81
82         $this->permissionsRepo->saveNewRole($request->all());
83         $this->showSuccessNotification(trans('settings.role_create_success'));
84
85         return redirect('/settings/roles');
86     }
87
88     /**
89      * Show the form for editing a user role.
90      */
91     public function edit(string $id)
92     {
93         $this->checkPermission('user-roles-manage');
94         $role = $this->permissionsRepo->getRoleById($id);
95
96         $this->setPageTitle(trans('settings.role_edit'));
97
98         return view('settings.roles.edit', ['role' => $role]);
99     }
100
101     /**
102      * Updates a user role.
103      *
104      * @throws ValidationException
105      */
106     public function update(Request $request, string $id)
107     {
108         $this->checkPermission('user-roles-manage');
109         $this->validate($request, [
110             'display_name' => ['required', 'min:3', 'max:180'],
111             'description'  => ['max:180'],
112         ]);
113
114         $this->permissionsRepo->updateRole($id, $request->all());
115         $this->showSuccessNotification(trans('settings.role_update_success'));
116
117         return redirect('/settings/roles');
118     }
119
120     /**
121      * Show the view to delete a role.
122      * Offers the chance to migrate users.
123      */
124     public function showDelete(string $id)
125     {
126         $this->checkPermission('user-roles-manage');
127         $role = $this->permissionsRepo->getRoleById($id);
128         $roles = $this->permissionsRepo->getAllRolesExcept($role);
129         $blankRole = $role->newInstance(['display_name' => trans('settings.role_delete_no_migration')]);
130         $roles->prepend($blankRole);
131
132         $this->setPageTitle(trans('settings.role_delete'));
133
134         return view('settings.roles.delete', ['role' => $role, 'roles' => $roles]);
135     }
136
137     /**
138      * Delete a role from the system,
139      * Migrate from a previous role if set.
140      *
141      * @throws Exception
142      */
143     public function delete(Request $request, string $id)
144     {
145         $this->checkPermission('user-roles-manage');
146
147         try {
148             $this->permissionsRepo->deleteRole($id, $request->get('migrate_role_id'));
149         } catch (PermissionsException $e) {
150             $this->showErrorNotification($e->getMessage());
151
152             return redirect()->back();
153         }
154
155         $this->showSuccessNotification(trans('settings.role_delete_success'));
156
157         return redirect('/settings/roles');
158     }
159 }