namespace BookStack\Http\Controllers;
use BookStack\Auth\Access\SocialAuthService;
-use BookStack\Auth\User;
+use BookStack\Auth\Queries\UsersAllPaginatedAndSorted;
+use BookStack\Auth\Role;
use BookStack\Auth\UserRepo;
use BookStack\Exceptions\ImageUploadException;
use BookStack\Exceptions\UserUpdateException;
use BookStack\Uploads\ImageRepo;
+use BookStack\Util\SimpleListOptions;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class UserController extends Controller
{
- protected $userRepo;
- protected $imageRepo;
+ protected UserRepo $userRepo;
+ protected ImageRepo $imageRepo;
- /**
- * UserController constructor.
- */
public function __construct(UserRepo $userRepo, ImageRepo $imageRepo)
{
$this->userRepo = $userRepo;
public function index(Request $request)
{
$this->checkPermission('users-manage');
- $listDetails = [
- 'order' => $request->get('order', 'asc'),
- 'search' => $request->get('search', ''),
- 'sort' => $request->get('sort', 'name'),
- ];
- $users = $this->userRepo->getAllUsersPaginatedAndSorted(20, $listDetails);
+
+ $listOptions = SimpleListOptions::fromRequest($request, 'users')->withSortOptions([
+ 'name' => trans('common.sort_name'),
+ 'email' => trans('auth.email'),
+ 'created_at' => trans('common.sort_created_at'),
+ 'updated_at' => trans('common.sort_updated_at'),
+ 'last_activity_at' => trans('settings.users_latest_activity'),
+ ]);
+
+ $users = (new UsersAllPaginatedAndSorted())->run(20, $listOptions);
$this->setPageTitle(trans('settings.users'));
- $users->appends($listDetails);
+ $users->appends($listOptions->getPaginationAppends());
- return view('users.index', ['users' => $users, 'listDetails' => $listDetails]);
+ return view('users.index', [
+ 'users' => $users,
+ 'listOptions' => $listOptions,
+ ]);
}
/**
{
$this->checkPermission('users-manage');
$authMethod = config('auth.method');
- $roles = $this->userRepo->getAllRoles();
+ $roles = Role::query()->orderBy('display_name', 'asc')->get();
$this->setPageTitle(trans('settings.users_add_new'));
return view('users.create', ['authMethod' => $authMethod, 'roles' => $roles]);
$passwordRequired = ($authMethod === 'standard' && !$sendInvite);
$validationRules = [
- 'name' => ['required'],
- 'email' => ['required', 'email', 'unique:users,email'],
- 'language' => ['string'],
+ 'name' => ['required', 'max:100'],
+ 'email' => ['required', 'email', 'unique:users,email'],
+ 'language' => ['string', 'max:15', 'alpha_dash'],
'roles' => ['array'],
'roles.*' => ['integer'],
- 'password' => $passwordRequired ? ['required', Password::default()] : null,
+ 'password' => $passwordRequired ? ['required', Password::default()] : null,
'password-confirm' => $passwordRequired ? ['required', 'same:password'] : null,
'external_auth_id' => $externalAuth ? ['required'] : null,
];
{
$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();
$mfaMethods = $user->mfaValues->groupBy('method');
$this->setPageTitle(trans('settings.user_profile'));
- $roles = $this->userRepo->getAllRoles();
+ $roles = Role::query()->orderBy('display_name', 'asc')->get();
return view('users.edit', [
'user' => $user,
$this->checkPermissionOrCurrentUser('users-manage', $id);
$validated = $this->validate($request, [
- 'name' => ['min:2'],
+ 'name' => ['min:2', 'max:100'],
'email' => ['min:2', 'email', 'unique:users,email,' . $id],
'password' => ['required_with:password_confirm', Password::default()],
'password-confirm' => ['same:password', 'required_with:password'],
- 'language' => ['string'],
+ 'language' => ['string', 'max:15', 'alpha_dash'],
'roles' => ['array'],
'roles.*' => ['integer'],
'external_auth_id' => ['string'],
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'];
- if (!in_array($type, $validSortTypes)) {
- return redirect()->back(500);
- }
-
- return $this->changeListSort($id, $request, $type);
- }
-
- /**
- * 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);
- }
-
- /**
- * Changed the stored preference for a list sort order.
- */
- protected function changeListSort(int $userId, Request $request, string $listName)
- {
- $this->checkPermissionOrCurrentUser('users-manage', $userId);
-
- $sort = $request->get('sort');
- if (!in_array($sort, ['name', 'created_at', 'updated_at', 'default'])) {
- $sort = 'name';
- }
-
- $order = $request->get('order');
- if (!in_array($order, ['asc', 'desc'])) {
- $order = 'asc';
- }
-
- $user = $this->userRepo->getById($userId);
- $sortKey = $listName . '_sort';
- $orderKey = $listName . '_sort_order';
- setting()->putUser($user, $sortKey, $sort);
- setting()->putUser($user, $orderKey, $order);
-
- return redirect()->back(302, [], "/settings/users/$userId");
- }
}