X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/2bb8c3d91402d2465b4ddb70832055a8b47dab0d..refs/pull/684/head:/app/Repos/UserRepo.php diff --git a/app/Repos/UserRepo.php b/app/Repos/UserRepo.php index 9b5c8d7e7..3cfd61d27 100644 --- a/app/Repos/UserRepo.php +++ b/app/Repos/UserRepo.php @@ -1,8 +1,12 @@ user->with('roles', 'avatar')->orderBy('name', 'asc')->get(); } + /** + * Get all the users with their permissions in a paginated format. + * @param int $count + * @param $sortData + * @return \Illuminate\Database\Eloquent\Builder|static + */ + public function getAllUsersPaginatedAndSorted($count, $sortData) + { + $query = $this->user->with('roles', 'avatar')->orderBy($sortData['sort'], $sortData['order']); + + if ($sortData['search']) { + $term = '%' . $sortData['search'] . '%'; + $query->where(function ($query) use ($term) { + $query->where('name', 'like', $term) + ->orWhere('email', 'like', $term); + }); + } + + return $query->paginate($count); + } + /** * Creates a new user and attaches a role to them. * @param array $data @@ -62,11 +87,7 @@ class UserRepo $this->attachDefaultRole($user); // Get avatar from gravatar and save - if (!config('services.disable_services')) { - $avatar = \Images::saveUserGravatar($user); - $user->avatar()->associate($avatar); - $user->save(); - } + $this->downloadGravatarToUserAvatar($user); return $user; } @@ -78,10 +99,27 @@ class UserRepo public function attachDefaultRole($user) { $roleId = setting('registration-role'); - if ($roleId === false) $roleId = $this->role->first()->id; + if ($roleId === false) { + $roleId = $this->role->first()->id; + } $user->attachRoleId($roleId); } + /** + * Assign a user to a system-level role. + * @param User $user + * @param $systemRoleName + * @throws NotFoundException + */ + public function attachSystemRole(User $user, $systemRoleName) + { + $role = $this->role->newQuery()->where('system_name', '=', $systemRoleName)->first(); + if ($role === null) { + throw new NotFoundException("Role '{$systemRoleName}' not found"); + } + $user->attachRole($role); + } + /** * Checks if the give user is the only admin. * @param User $user @@ -89,10 +127,14 @@ class UserRepo */ public function isOnlyAdmin(User $user) { - if (!$user->roles->pluck('name')->contains('admin')) return false; + if (!$user->hasSystemRole('admin')) { + return false; + } - $adminRole = $this->role->getRole('admin'); - if ($adminRole->users->count() > 1) return false; + $adminRole = $this->role->getSystemRole('admin'); + if ($adminRole->users->count() > 1) { + return false; + } return true; } @@ -114,11 +156,18 @@ class UserRepo /** * Remove the given user from storage, Delete all related content. * @param User $user + * @throws Exception */ public function destroy(User $user) { $user->socialAccounts()->delete(); $user->delete(); + + // Delete user profile images + $profileImages = $images = Image::where('type', '=', 'user')->where('created_by', '=', $user->id)->get(); + foreach ($profileImages as $image) { + Images::destroyImage($image); + } } /** @@ -130,7 +179,7 @@ class UserRepo */ public function getActivity(User $user, $count = 20, $page = 0) { - return \Activity::userActivity($user, $count, $page); + return Activity::userActivity($user, $count, $page); } /** @@ -142,13 +191,13 @@ class UserRepo public function getRecentlyCreated(User $user, $count = 20) { return [ - 'pages' => $this->entityRepo->getRecentlyCreatedPages($count, 0, function ($query) use ($user) { + 'pages' => $this->entityRepo->getRecentlyCreated('page', $count, 0, function ($query) use ($user) { $query->where('created_by', '=', $user->id); }), - 'chapters' => $this->entityRepo->getRecentlyCreatedChapters($count, 0, function ($query) use ($user) { + 'chapters' => $this->entityRepo->getRecentlyCreated('chapter', $count, 0, function ($query) use ($user) { $query->where('created_by', '=', $user->id); }), - 'books' => $this->entityRepo->getRecentlyCreatedBooks($count, 0, function ($query) use ($user) { + 'books' => $this->entityRepo->getRecentlyCreated('book', $count, 0, function ($query) use ($user) { $query->where('created_by', '=', $user->id); }) ]; @@ -168,6 +217,15 @@ class UserRepo ]; } + /** + * Get the roles in the system that are assignable to a user. + * @return mixed + */ + public function getAllRoles() + { + return $this->role->all(); + } + /** * Get all the roles which can be given restricted access to * other entities in the system. @@ -175,7 +233,30 @@ class UserRepo */ public function getRestrictableRoles() { - return $this->role->where('name', '!=', 'admin')->get(); + return $this->role->where('system_name', '!=', 'admin')->get(); } -} \ No newline at end of file + /** + * Get a gravatar image for a user and set it as their avatar. + * Does not run if gravatar disabled in config. + * @param User $user + * @return bool + */ + public function downloadGravatarToUserAvatar(User $user) + { + // Get avatar from gravatar and save + if (!config('services.gravatar')) { + return false; + } + + try { + $avatar = Images::saveUserGravatar($user); + $user->avatar()->associate($avatar); + $user->save(); + return true; + } catch (Exception $e) { + \Log::error('Failed to save user gravatar image'); + return false; + } + } +}