]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/UserController.php
Added pagination, sorting & searching to users list
[bookstack] / app / Http / Controllers / UserController.php
1 <?php
2
3 namespace BookStack\Http\Controllers;
4
5 use BookStack\Activity;
6 use Illuminate\Http\Request;
7
8 use Illuminate\Http\Response;
9 use BookStack\Http\Requests;
10 use BookStack\Repos\UserRepo;
11 use BookStack\Services\SocialAuthService;
12 use BookStack\User;
13
14 class UserController extends Controller
15 {
16
17     protected $user;
18     protected $userRepo;
19
20     /**
21      * UserController constructor.
22      * @param User     $user
23      * @param UserRepo $userRepo
24      */
25     public function __construct(User $user, UserRepo $userRepo)
26     {
27         $this->user = $user;
28         $this->userRepo = $userRepo;
29         parent::__construct();
30     }
31
32     /**
33      * Display a listing of the users.
34      * @param Request $request
35      * @return Response
36      */
37     public function index(Request $request)
38     {
39         $this->checkPermission('users-manage');
40         $listDetails = [
41             'order' => $request->has('order') ? $request->get('order') : 'asc',
42             'search' => $request->has('search') ? $request->get('search') : '',
43             'sort' => $request->has('sort') ? $request->get('sort') : 'name',
44         ];
45         $users = $this->userRepo->getAllUsersPaginatedAndSorted(20, $listDetails);
46         $this->setPageTitle('Users');
47         $users->appends($listDetails);
48         return view('users/index', ['users' => $users, 'listDetails' => $listDetails]);
49     }
50
51     /**
52      * Show the form for creating a new user.
53      * @return Response
54      */
55     public function create()
56     {
57         $this->checkPermission('users-manage');
58         $authMethod = config('auth.method');
59         $roles = $this->userRepo->getAssignableRoles();
60         return view('users/create', ['authMethod' => $authMethod, 'roles' => $roles]);
61     }
62
63     /**
64      * Store a newly created user in storage.
65      * @param  Request $request
66      * @return Response
67      */
68     public function store(Request $request)
69     {
70         $this->checkPermission('users-manage');
71         $validationRules = [
72             'name'             => 'required',
73             'email'            => 'required|email|unique:users,email'
74         ];
75
76         $authMethod = config('auth.method');
77         if ($authMethod === 'standard') {
78             $validationRules['password'] = 'required|min:5';
79             $validationRules['password-confirm'] = 'required|same:password';
80         } elseif ($authMethod === 'ldap') {
81             $validationRules['external_auth_id'] = 'required';
82         }
83         $this->validate($request, $validationRules);
84
85
86         $user = $this->user->fill($request->all());
87
88         if ($authMethod === 'standard') {
89             $user->password = bcrypt($request->get('password'));
90         } elseif ($authMethod === 'ldap') {
91             $user->external_auth_id = $request->get('external_auth_id');
92         }
93
94         $user->save();
95
96         if ($request->has('roles')) {
97             $roles = $request->get('roles');
98             $user->roles()->sync($roles);
99         }
100
101         // Get avatar from gravatar and save
102         if (!config('services.disable_services')) {
103             $avatar = \Images::saveUserGravatar($user);
104             $user->avatar()->associate($avatar);
105             $user->save();
106         }
107
108         return redirect('/settings/users');
109     }
110
111     /**
112      * Show the form for editing the specified user.
113      * @param  int              $id
114      * @param SocialAuthService $socialAuthService
115      * @return Response
116      */
117     public function edit($id, SocialAuthService $socialAuthService)
118     {
119         $this->checkPermissionOr('users-manage', function () use ($id) {
120             return $this->currentUser->id == $id;
121         });
122
123         $authMethod = config('auth.method');
124
125         $user = $this->user->findOrFail($id);
126         $activeSocialDrivers = $socialAuthService->getActiveDrivers();
127         $this->setPageTitle('User Profile');
128         $roles = $this->userRepo->getAssignableRoles();
129         return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers, 'authMethod' => $authMethod, 'roles' => $roles]);
130     }
131
132     /**
133      * Update the specified user in storage.
134      * @param  Request $request
135      * @param  int     $id
136      * @return Response
137      */
138     public function update(Request $request, $id)
139     {
140         $this->preventAccessForDemoUsers();
141         $this->checkPermissionOr('users-manage', function () use ($id) {
142             return $this->currentUser->id == $id;
143         });
144
145         $this->validate($request, [
146             'name'             => 'min:2',
147             'email'            => 'min:2|email|unique:users,email,' . $id,
148             'password'         => 'min:5|required_with:password_confirm',
149             'password-confirm' => 'same:password|required_with:password'
150         ], [
151             'password-confirm.required_with' => 'Password confirmation required'
152         ]);
153
154         $user = $this->user->findOrFail($id);
155         $user->fill($request->all());
156
157         // Role updates
158         if (userCan('users-manage') && $request->has('roles')) {
159             $roles = $request->get('roles');
160             $user->roles()->sync($roles);
161         }
162
163         // Password updates
164         if ($request->has('password') && $request->get('password') != '') {
165             $password = $request->get('password');
166             $user->password = bcrypt($password);
167         }
168
169         // External auth id updates
170         if ($this->currentUser->can('users-manage') && $request->has('external_auth_id')) {
171             $user->external_auth_id = $request->get('external_auth_id');
172         }
173
174         $user->save();
175         session()->flash('success', 'User successfully updated');
176
177         $redirectUrl = userCan('users-manage') ? '/settings/users' : '/settings/users/' . $user->id;
178         return redirect($redirectUrl);
179     }
180
181     /**
182      * Show the user delete page.
183      * @param $id
184      * @return \Illuminate\View\View
185      */
186     public function delete($id)
187     {
188         $this->checkPermissionOr('users-manage', function () use ($id) {
189             return $this->currentUser->id == $id;
190         });
191
192         $user = $this->user->findOrFail($id);
193         $this->setPageTitle('Delete User ' . $user->name);
194         return view('users/delete', ['user' => $user]);
195     }
196
197     /**
198      * Remove the specified user from storage.
199      * @param  int $id
200      * @return Response
201      */
202     public function destroy($id)
203     {
204         $this->preventAccessForDemoUsers();
205         $this->checkPermissionOr('users-manage', function () use ($id) {
206             return $this->currentUser->id == $id;
207         });
208
209         $user = $this->userRepo->getById($id);
210
211         if ($this->userRepo->isOnlyAdmin($user)) {
212             session()->flash('error', 'You cannot delete the only admin');
213             return redirect($user->getEditUrl());
214         }
215
216         $this->userRepo->destroy($user);
217         session()->flash('success', 'User successfully removed');
218
219         return redirect('/settings/users');
220     }
221
222     /**
223      * Show the user profile page
224      * @param $id
225      * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
226      */
227     public function showProfilePage($id)
228     {
229         $user = $this->userRepo->getById($id);
230         $userActivity = $this->userRepo->getActivity($user);
231         $recentlyCreated = $this->userRepo->getRecentlyCreated($user, 5, 0);
232         $assetCounts = $this->userRepo->getAssetCounts($user);
233         return view('users/profile', [
234             'user' => $user,
235             'activity' => $userActivity,
236             'recentlyCreated' => $recentlyCreated,
237             'assetCounts' => $assetCounts
238         ]);
239     }
240 }