use Activity;
use BookStack\Entities\Repos\EntityRepo;
use BookStack\Exceptions\NotFoundException;
+use BookStack\Exceptions\UserUpdateException;
use BookStack\Uploads\Image;
use Exception;
+use Illuminate\Database\Eloquent\Builder;
use Images;
class UserRepo
*/
public function getById($id)
{
- return $this->user->findOrFail($id);
+ return $this->user->newQuery()->findOrFail($id);
}
/**
* Get all the users with their permissions.
- * @return \Illuminate\Database\Eloquent\Builder|static
+ * @return Builder|static
*/
public function getAllUsers()
{
* Get all the users with their permissions in a paginated format.
* @param int $count
* @param $sortData
- * @return \Illuminate\Database\Eloquent\Builder|static
+ * @return Builder|static
*/
public function getAllUsersPaginatedAndSorted($count, $sortData)
{
return true;
}
+ /**
+ * Set the assigned user roles via an array of role IDs.
+ * @param User $user
+ * @param array $roles
+ * @throws UserUpdateException
+ */
+ public function setUserRoles(User $user, array $roles)
+ {
+ if ($this->demotingLastAdmin($user, $roles)) {
+ throw new UserUpdateException(trans('errors.role_cannot_remove_only_admin'), $user->getEditUrl());
+ }
+
+ $user->roles()->sync($roles);
+ }
+
+ /**
+ * Check if the given user is the last admin and their new roles no longer
+ * contains the admin role.
+ * @param User $user
+ * @param array $newRoles
+ * @return bool
+ */
+ protected function demotingLastAdmin(User $user, array $newRoles) : bool
+ {
+ if ($this->isOnlyAdmin($user)) {
+ $adminRole = $this->role->getSystemRole('admin');
+ if (!in_array(strval($adminRole->id), $newRoles)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
/**
* Create a new basic instance of user.
* @param array $data
*/
public function create(array $data, $verifyEmail = false)
{
-
return $this->user->forceCreate([
'name' => $data['name'],
'email' => $data['email'],
$user->delete();
// Delete user profile images
- $profileImages = $images = Image::where('type', '=', 'user')->where('created_by', '=', $user->id)->get();
+ $profileImages = Image::where('type', '=', 'user')->where('uploaded_to', '=', $user->id)->get();
foreach ($profileImages as $image) {
Images::destroy($image);
}
*/
public function getRecentlyCreated(User $user, $count = 20)
{
+ $createdByUserQuery = function (Builder $query) use ($user) {
+ $query->where('created_by', '=', $user->id);
+ };
+
return [
- 'pages' => $this->entityRepo->getRecentlyCreated('page', $count, 0, function ($query) use ($user) {
- $query->where('created_by', '=', $user->id);
- }),
- 'chapters' => $this->entityRepo->getRecentlyCreated('chapter', $count, 0, function ($query) use ($user) {
- $query->where('created_by', '=', $user->id);
- }),
- 'books' => $this->entityRepo->getRecentlyCreated('book', $count, 0, function ($query) use ($user) {
- $query->where('created_by', '=', $user->id);
- })
+ 'pages' => $this->entityRepo->getRecentlyCreated('page', $count, 0, $createdByUserQuery),
+ 'chapters' => $this->entityRepo->getRecentlyCreated('chapter', $count, 0, $createdByUserQuery),
+ 'books' => $this->entityRepo->getRecentlyCreated('book', $count, 0, $createdByUserQuery),
+ 'shelves' => $this->entityRepo->getRecentlyCreated('bookshelf', $count, 0, $createdByUserQuery)
];
}
'pages' => $this->entityRepo->getUserTotalCreated('page', $user),
'chapters' => $this->entityRepo->getUserTotalCreated('chapter', $user),
'books' => $this->entityRepo->getUserTotalCreated('book', $user),
+ 'shelves' => $this->entityRepo->getUserTotalCreated('bookshelf', $user),
];
}
*/
public function getAllRoles()
{
- return $this->role->all();
+ return $this->role->newQuery()->orderBy('name', 'asc')->get();
}
/**