1 <?php namespace BookStack\Http\Controllers;
4 use Illuminate\Http\Request;
5 use Illuminate\Http\Response;
6 use BookStack\Repos\UserRepo;
7 use BookStack\Services\SocialAuthService;
10 class UserController extends Controller
17 * UserController constructor.
19 * @param UserRepo $userRepo
21 public function __construct(User $user, UserRepo $userRepo)
24 $this->userRepo = $userRepo;
25 parent::__construct();
29 * Display a listing of the users.
30 * @param Request $request
33 public function index(Request $request)
35 $this->checkPermission('users-manage');
37 'order' => $request->get('order', 'asc'),
38 'search' => $request->get('search', ''),
39 'sort' => $request->get('sort', 'name'),
41 $users = $this->userRepo->getAllUsersPaginatedAndSorted(20, $listDetails);
42 $this->setPageTitle(trans('settings.users'));
43 $users->appends($listDetails);
44 return view('users/index', ['users' => $users, 'listDetails' => $listDetails]);
48 * Show the form for creating a new user.
51 public function create()
53 $this->checkPermission('users-manage');
54 $authMethod = config('auth.method');
55 $roles = $this->userRepo->getAllRoles();
56 return view('users/create', ['authMethod' => $authMethod, 'roles' => $roles]);
60 * Store a newly created user in storage.
61 * @param Request $request
64 public function store(Request $request)
66 $this->checkPermission('users-manage');
69 'email' => 'required|email|unique:users,email'
72 $authMethod = config('auth.method');
73 if ($authMethod === 'standard') {
74 $validationRules['password'] = 'required|min:5';
75 $validationRules['password-confirm'] = 'required|same:password';
76 } elseif ($authMethod === 'ldap') {
77 $validationRules['external_auth_id'] = 'required';
79 $this->validate($request, $validationRules);
81 $user = $this->user->fill($request->all());
83 if ($authMethod === 'standard') {
84 $user->password = bcrypt($request->get('password'));
85 } elseif ($authMethod === 'ldap') {
86 $user->external_auth_id = $request->get('external_auth_id');
91 if ($request->filled('roles')) {
92 $roles = $request->get('roles');
93 $user->roles()->sync($roles);
96 $this->userRepo->downloadGravatarToUserAvatar($user);
98 return redirect('/settings/users');
102 * Show the form for editing the specified user.
104 * @param SocialAuthService $socialAuthService
107 public function edit($id, SocialAuthService $socialAuthService)
109 $this->checkPermissionOr('users-manage', function () use ($id) {
110 return $this->currentUser->id == $id;
113 $user = $this->user->findOrFail($id);
115 $authMethod = ($user->system_name) ? 'system' : config('auth.method');
117 $activeSocialDrivers = $socialAuthService->getActiveDrivers();
118 $this->setPageTitle(trans('settings.user_profile'));
119 $roles = $this->userRepo->getAllRoles();
120 return view('users/edit', ['user' => $user, 'activeSocialDrivers' => $activeSocialDrivers, 'authMethod' => $authMethod, 'roles' => $roles]);
124 * Update the specified user in storage.
125 * @param Request $request
129 public function update(Request $request, $id)
131 $this->preventAccessForDemoUsers();
132 $this->checkPermissionOr('users-manage', function () use ($id) {
133 return $this->currentUser->id == $id;
136 $this->validate($request, [
138 'email' => 'min:2|email|unique:users,email,' . $id,
139 'password' => 'min:5|required_with:password_confirm',
140 'password-confirm' => 'same:password|required_with:password',
144 $user = $this->user->findOrFail($id);
145 $user->fill($request->all());
148 if (userCan('users-manage') && $request->filled('roles')) {
149 $roles = $request->get('roles');
150 $user->roles()->sync($roles);
154 if ($request->filled('password')) {
155 $password = $request->get('password');
156 $user->password = bcrypt($password);
159 // External auth id updates
160 if ($this->currentUser->can('users-manage') && $request->filled('external_auth_id')) {
161 $user->external_auth_id = $request->get('external_auth_id');
164 // Save an user-specific settings
165 if ($request->filled('setting')) {
166 foreach ($request->get('setting') as $key => $value) {
167 setting()->putUser($user, $key, $value);
172 session()->flash('success', trans('settings.users_edit_success'));
174 $redirectUrl = userCan('users-manage') ? '/settings/users' : '/settings/users/' . $user->id;
175 return redirect($redirectUrl);
179 * Show the user delete page.
181 * @return \Illuminate\View\View
183 public function delete($id)
185 $this->checkPermissionOr('users-manage', function () use ($id) {
186 return $this->currentUser->id == $id;
189 $user = $this->user->findOrFail($id);
190 $this->setPageTitle(trans('settings.users_delete_named', ['userName' => $user->name]));
191 return view('users/delete', ['user' => $user]);
195 * Remove the specified user from storage.
199 public function destroy($id)
201 $this->preventAccessForDemoUsers();
202 $this->checkPermissionOr('users-manage', function () use ($id) {
203 return $this->currentUser->id == $id;
206 $user = $this->userRepo->getById($id);
208 if ($this->userRepo->isOnlyAdmin($user)) {
209 session()->flash('error', trans('errors.users_cannot_delete_only_admin'));
210 return redirect($user->getEditUrl());
213 if ($user->system_name === 'public') {
214 session()->flash('error', trans('errors.users_cannot_delete_guest'));
215 return redirect($user->getEditUrl());
218 $this->userRepo->destroy($user);
219 session()->flash('success', trans('settings.users_delete_success'));
221 return redirect('/settings/users');
225 * Show the user profile page
227 * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
229 public function showProfilePage($id)
231 $user = $this->userRepo->getById($id);
232 $userActivity = $this->userRepo->getActivity($user);
233 $recentlyCreated = $this->userRepo->getRecentlyCreated($user, 5, 0);
234 $assetCounts = $this->userRepo->getAssetCounts($user);
235 return view('users/profile', [
237 'activity' => $userActivity,
238 'recentlyCreated' => $recentlyCreated,
239 'assetCounts' => $assetCounts
244 * Update the user's preferred book-list display setting.
246 * @param Request $request
247 * @return \Illuminate\Http\RedirectResponse
249 public function switchBookView($id, Request $request)
251 $this->checkPermissionOr('users-manage', function () use ($id) {
252 return $this->currentUser->id == $id;
255 $viewType = $request->get('view_type');
256 if (!in_array($viewType, ['grid', 'list'])) {
260 $user = $this->user->findOrFail($id);
261 setting()->putUser($user, 'books_view_type', $viewType);
263 return redirect()->back(302, [], "/settings/users/$id");
267 * Update the user's preferred shelf-list display setting.
269 * @param Request $request
270 * @return \Illuminate\Http\RedirectResponse
272 public function switchShelfView($id, Request $request)
274 $this->checkPermissionOr('users-manage', function () use ($id) {
275 return $this->currentUser->id == $id;
278 $viewType = $request->get('view_type');
279 if (!in_array($viewType, ['grid', 'list'])) {
283 $user = $this->user->findOrFail($id);
284 setting()->putUser($user, 'bookshelves_view_type', $viewType);
286 return redirect()->back(302, [], "/settings/users/$id");