use BookStack\Auth\Access\SocialAuthService;
use BookStack\Auth\Queries\UsersAllPaginatedAndSorted;
use BookStack\Auth\Role;
-use BookStack\Auth\User;
use BookStack\Auth\UserRepo;
use BookStack\Exceptions\ImageUploadException;
use BookStack\Exceptions\UserUpdateException;
protected UserRepo $userRepo;
protected ImageRepo $imageRepo;
- /**
- * UserController constructor.
- */
public function __construct(UserRepo $userRepo, ImageRepo $imageRepo)
{
$this->userRepo = $userRepo;
{
$this->checkPermissionOrCurrentUser('users-manage', $id);
- /** @var User $user */
- $user = User::query()->with(['apiTokens', 'mfaValues'])->findOrFail($id);
-
+ $user = $this->userRepo->getById($id);
+ $user->load(['apiTokens', 'mfaValues']);
$authMethod = ($user->system_name) ? 'system' : config('auth.method');
$activeSocialDrivers = $socialAuthService->getActiveDrivers();
return redirect('/settings/users');
}
-
- /**
- * Update the user's preferred book-list display setting.
- */
- public function switchBooksView(Request $request, int $id)
- {
- return $this->switchViewType($id, $request, 'books');
- }
-
- /**
- * Update the user's preferred shelf-list display setting.
- */
- public function switchShelvesView(Request $request, int $id)
- {
- return $this->switchViewType($id, $request, 'bookshelves');
- }
-
- /**
- * Update the user's preferred shelf-view book list display setting.
- */
- public function switchShelfView(Request $request, int $id)
- {
- return $this->switchViewType($id, $request, 'bookshelf');
- }
-
- /**
- * For a type of list, switch with stored view type for a user.
- */
- protected function switchViewType(int $userId, Request $request, string $listName)
- {
- $this->checkPermissionOrCurrentUser('users-manage', $userId);
-
- $viewType = $request->get('view_type');
- if (!in_array($viewType, ['grid', 'list'])) {
- $viewType = 'list';
- }
-
- $user = $this->userRepo->getById($userId);
- $key = $listName . '_view_type';
- setting()->putUser($user, $key, $viewType);
-
- return redirect()->back(302, [], "/settings/users/$userId");
- }
-
- /**
- * Change the stored sort type for a particular view.
- */
- public function changeSort(Request $request, string $id, string $type)
- {
- $validSortTypes = ['books', 'bookshelves', 'shelf_books', 'users', 'roles', 'webhooks'];
- if (!in_array($type, $validSortTypes)) {
- return redirect()->back(500);
- }
-
- $this->checkPermissionOrCurrentUser('users-manage', $id);
-
- $sort = substr($request->get('sort') ?: 'name', 0, 50);
- $order = $request->get('order') === 'desc' ? 'desc' : 'asc';
-
- $user = $this->userRepo->getById($id);
- $sortKey = $type . '_sort';
- $orderKey = $type . '_sort_order';
- setting()->putUser($user, $sortKey, $sort);
- setting()->putUser($user, $orderKey, $order);
-
- return redirect()->back(302, [], "/settings/users/{$id}");
- }
-
- /**
- * Toggle dark mode for the current user.
- */
- public function toggleDarkMode()
- {
- $enabled = setting()->getForCurrentUser('dark-mode-enabled', false);
- setting()->putUser(user(), 'dark-mode-enabled', $enabled ? 'false' : 'true');
-
- return redirect()->back();
- }
-
- /**
- * Update the stored section expansion preference for the given user.
- */
- public function updateExpansionPreference(Request $request, string $id, string $key)
- {
- $this->checkPermissionOrCurrentUser('users-manage', $id);
- $keyWhitelist = ['home-details'];
- if (!in_array($key, $keyWhitelist)) {
- return response('Invalid key', 500);
- }
-
- $newState = $request->get('expand', 'false');
-
- $user = $this->userRepo->getById($id);
- setting()->putUser($user, 'section_expansion#' . $key, $newState);
-
- return response('', 204);
- }
-
- public function updateCodeLanguageFavourite(Request $request)
- {
- $validated = $this->validate($request, [
- 'language' => ['required', 'string', 'max:20'],
- 'active' => ['required', 'bool'],
- ]);
-
- $currentFavoritesStr = setting()->getForCurrentUser('code-language-favourites', '');
- $currentFavorites = array_filter(explode(',', $currentFavoritesStr));
-
- $isFav = in_array($validated['language'], $currentFavorites);
- if (!$isFav && $validated['active']) {
- $currentFavorites[] = $validated['language'];
- } elseif ($isFav && !$validated['active']) {
- $index = array_search($validated['language'], $currentFavorites);
- array_splice($currentFavorites, $index, 1);
- }
-
- setting()->putUser(user(), 'code-language-favourites', implode(',', $currentFavorites));
- }
}
--- /dev/null
+<?php
+
+namespace BookStack\Http\Controllers;
+
+use BookStack\Auth\UserRepo;
+use Illuminate\Http\Request;
+
+class UserPreferencesController extends Controller
+{
+ protected UserRepo $userRepo;
+
+ public function __construct(UserRepo $userRepo)
+ {
+ $this->userRepo = $userRepo;
+ }
+
+ /**
+ * Update the user's preferred book-list display setting.
+ */
+ public function switchBooksView(Request $request, int $id)
+ {
+ return $this->switchViewType($id, $request, 'books');
+ }
+
+ /**
+ * Update the user's preferred shelf-list display setting.
+ */
+ public function switchShelvesView(Request $request, int $id)
+ {
+ return $this->switchViewType($id, $request, 'bookshelves');
+ }
+
+ /**
+ * Update the user's preferred shelf-view book list display setting.
+ */
+ public function switchShelfView(Request $request, int $id)
+ {
+ return $this->switchViewType($id, $request, 'bookshelf');
+ }
+
+ /**
+ * For a type of list, switch with stored view type for a user.
+ */
+ protected function switchViewType(int $userId, Request $request, string $listName)
+ {
+ $this->checkPermissionOrCurrentUser('users-manage', $userId);
+
+ $viewType = $request->get('view_type');
+ if (!in_array($viewType, ['grid', 'list'])) {
+ $viewType = 'list';
+ }
+
+ $user = $this->userRepo->getById($userId);
+ $key = $listName . '_view_type';
+ setting()->putUser($user, $key, $viewType);
+
+ return redirect()->back(302, [], "/settings/users/$userId");
+ }
+
+ /**
+ * Change the stored sort type for a particular view.
+ */
+ public function changeSort(Request $request, string $id, string $type)
+ {
+ $validSortTypes = ['books', 'bookshelves', 'shelf_books', 'users', 'roles', 'webhooks'];
+ if (!in_array($type, $validSortTypes)) {
+ return redirect()->back(500);
+ }
+
+ $this->checkPermissionOrCurrentUser('users-manage', $id);
+
+ $sort = substr($request->get('sort') ?: 'name', 0, 50);
+ $order = $request->get('order') === 'desc' ? 'desc' : 'asc';
+
+ $user = $this->userRepo->getById($id);
+ $sortKey = $type . '_sort';
+ $orderKey = $type . '_sort_order';
+ setting()->putUser($user, $sortKey, $sort);
+ setting()->putUser($user, $orderKey, $order);
+
+ return redirect()->back(302, [], "/settings/users/{$id}");
+ }
+
+ /**
+ * Toggle dark mode for the current user.
+ */
+ public function toggleDarkMode()
+ {
+ $enabled = setting()->getForCurrentUser('dark-mode-enabled', false);
+ setting()->putUser(user(), 'dark-mode-enabled', $enabled ? 'false' : 'true');
+
+ return redirect()->back();
+ }
+
+ /**
+ * Update the stored section expansion preference for the given user.
+ */
+ public function updateExpansionPreference(Request $request, string $id, string $key)
+ {
+ $this->checkPermissionOrCurrentUser('users-manage', $id);
+ $keyWhitelist = ['home-details'];
+ if (!in_array($key, $keyWhitelist)) {
+ return response('Invalid key', 500);
+ }
+
+ $newState = $request->get('expand', 'false');
+
+ $user = $this->userRepo->getById($id);
+ setting()->putUser($user, 'section_expansion#' . $key, $newState);
+
+ return response('', 204);
+ }
+
+ public function updateCodeLanguageFavourite(Request $request)
+ {
+ $validated = $this->validate($request, [
+ 'language' => ['required', 'string', 'max:20'],
+ 'active' => ['required', 'bool'],
+ ]);
+
+ $currentFavoritesStr = setting()->getForCurrentUser('code-language-favourites', '');
+ $currentFavorites = array_filter(explode(',', $currentFavoritesStr));
+
+ $isFav = in_array($validated['language'], $currentFavorites);
+ if (!$isFav && $validated['active']) {
+ $currentFavorites[] = $validated['language'];
+ } elseif ($isFav && !$validated['active']) {
+ $index = array_search($validated['language'], $currentFavorites);
+ array_splice($currentFavorites, $index, 1);
+ }
+
+ setting()->putUser(user(), 'code-language-favourites', implode(',', $currentFavorites));
+ }
+}
use BookStack\Http\Controllers\TagController;
use BookStack\Http\Controllers\UserApiTokenController;
use BookStack\Http\Controllers\UserController;
+use BookStack\Http\Controllers\UserPreferencesController;
use BookStack\Http\Controllers\UserProfileController;
use BookStack\Http\Controllers\UserSearchController;
use BookStack\Http\Controllers\WebhookController;
Route::get('/settings/users', [UserController::class, 'index']);
Route::get('/settings/users/create', [UserController::class, 'create']);
Route::get('/settings/users/{id}/delete', [UserController::class, 'delete']);
- Route::patch('/settings/users/{id}/switch-books-view', [UserController::class, 'switchBooksView']);
- Route::patch('/settings/users/{id}/switch-shelves-view', [UserController::class, 'switchShelvesView']);
- Route::patch('/settings/users/{id}/switch-shelf-view', [UserController::class, 'switchShelfView']);
- Route::patch('/settings/users/{id}/change-sort/{type}', [UserController::class, 'changeSort']);
- Route::patch('/settings/users/{id}/update-expansion-preference/{key}', [UserController::class, 'updateExpansionPreference']);
- Route::patch('/settings/users/toggle-dark-mode', [UserController::class, 'toggleDarkMode']);
- Route::patch('/settings/users/update-code-language-favourite', [UserController::class, 'updateCodeLanguageFavourite']);
Route::post('/settings/users/create', [UserController::class, 'store']);
Route::get('/settings/users/{id}', [UserController::class, 'edit']);
Route::put('/settings/users/{id}', [UserController::class, 'update']);
Route::delete('/settings/users/{id}', [UserController::class, 'destroy']);
+ // User Preferences
+ Route::patch('/settings/users/{id}/switch-books-view', [UserPreferencesController::class, 'switchBooksView']);
+ Route::patch('/settings/users/{id}/switch-shelves-view', [UserPreferencesController::class, 'switchShelvesView']);
+ Route::patch('/settings/users/{id}/switch-shelf-view', [UserPreferencesController::class, 'switchShelfView']);
+ Route::patch('/settings/users/{id}/change-sort/{type}', [UserPreferencesController::class, 'changeSort']);
+ Route::patch('/settings/users/{id}/update-expansion-preference/{key}', [UserPreferencesController::class, 'updateExpansionPreference']);
+ Route::patch('/settings/users/toggle-dark-mode', [UserPreferencesController::class, 'toggleDarkMode']);
+ Route::patch('/settings/users/update-code-language-favourite', [UserPreferencesController::class, 'updateCodeLanguageFavourite']);
+
// User API Tokens
Route::get('/settings/users/{userId}/create-api-token', [UserApiTokenController::class, 'create']);
Route::post('/settings/users/{userId}/create-api-token', [UserApiTokenController::class, 'store']);