]> BookStack Code Mirror - bookstack/blobdiff - app/Http/Controllers/PermissionController.php
Fixed role permission removal bug
[bookstack] / app / Http / Controllers / PermissionController.php
index 69e2619b69aa6186b364f9630af4af35e0bb66b0..cd064e7e80675e47188d0b02644926f94cfb8769 100644 (file)
@@ -1,27 +1,21 @@
-<?php
+<?php namespace BookStack\Http\Controllers;
 
-namespace BookStack\Http\Controllers;
-
-use BookStack\Role;
-use BookStack\User;
+use BookStack\Exceptions\PermissionsException;
+use BookStack\Repos\PermissionsRepo;
 use Illuminate\Http\Request;
 
-use BookStack\Http\Requests;
-use BookStack\Http\Controllers\Controller;
-
 class PermissionController extends Controller
 {
 
-    protected $role;
+    protected $permissionsRepo;
 
     /**
      * PermissionController constructor.
-     * @param $role
-     * @param $user
+     * @param PermissionsRepo $permissionsRepo
      */
-    public function __construct(Role $role)
+    public function __construct(PermissionsRepo $permissionsRepo)
     {
-        $this->role = $role;
+        $this->permissionsRepo = $permissionsRepo;
         parent::__construct();
     }
 
@@ -30,20 +24,107 @@ class PermissionController extends Controller
      */
     public function listRoles()
     {
-        $this->checkPermission('settings-update');
-        $roles = $this->role->all();
+        $this->checkPermission('user-roles-manage');
+        $roles = $this->permissionsRepo->getAllRoles();
         return view('settings/roles/index', ['roles' => $roles]);
     }
 
+    /**
+     * Show the form to create a new role
+     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
+     */
+    public function createRole()
+    {
+        $this->checkPermission('user-roles-manage');
+        return view('settings/roles/create');
+    }
+
+    /**
+     * Store a new role in the system.
+     * @param Request $request
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     */
+    public function storeRole(Request $request)
+    {
+        $this->checkPermission('user-roles-manage');
+        $this->validate($request, [
+            'display_name' => 'required|min:3|max:200',
+            'description' => 'max:250'
+        ]);
+
+        $this->permissionsRepo->saveNewRole($request->all());
+        session()->flash('success', trans('settings.role_create_success'));
+        return redirect('/settings/roles');
+    }
+
     /**
      * Show the form for editing a user role.
      * @param $id
      * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
+     * @throws PermissionsException
      */
     public function editRole($id)
     {
-        $this->checkPermission('settings-update');
-        $role = $this->role->findOrFail($id);
+        $this->checkPermission('user-roles-manage');
+        $role = $this->permissionsRepo->getRoleById($id);
+        if ($role->hidden) throw new PermissionsException(trans('errors.role_cannot_be_edited'));
         return view('settings/roles/edit', ['role' => $role]);
     }
+
+    /**
+     * Updates a user role.
+     * @param $id
+     * @param Request $request
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     */
+    public function updateRole($id, Request $request)
+    {
+        $this->checkPermission('user-roles-manage');
+        $this->validate($request, [
+            'display_name' => 'required|min:3|max:200',
+            'description' => 'max:250'
+        ]);
+
+        $this->permissionsRepo->updateRole($id, $request->all());
+        session()->flash('success', trans('settings.role_update_success'));
+        return redirect('/settings/roles');
+    }
+
+    /**
+     * Show the view to delete a role.
+     * Offers the chance to migrate users.
+     * @param $id
+     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
+     */
+    public function showDeleteRole($id)
+    {
+        $this->checkPermission('user-roles-manage');
+        $role = $this->permissionsRepo->getRoleById($id);
+        $roles = $this->permissionsRepo->getAllRolesExcept($role);
+        $blankRole = $role->newInstance(['display_name' => trans('settings.role_delete_no_migration')]);
+        $roles->prepend($blankRole);
+        return view('settings/roles/delete', ['role' => $role, 'roles' => $roles]);
+    }
+
+    /**
+     * Delete a role from the system,
+     * Migrate from a previous role if set.
+     * @param $id
+     * @param Request $request
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     */
+    public function deleteRole($id, Request $request)
+    {
+        $this->checkPermission('user-roles-manage');
+
+        try {
+            $this->permissionsRepo->deleteRole($id, $request->get('migrate_role_id'));
+        } catch (PermissionsException $e) {
+            session()->flash('error', $e->getMessage());
+            return redirect()->back();
+        }
+
+        session()->flash('success', trans('settings.role_delete_success'));
+        return redirect('/settings/roles');
+    }
 }