diff --git a/app/Entities/Repos/BaseRepo.php b/app/Entities/Repos/BaseRepo.php index f93271430..8b2e70074 100644 --- a/app/Entities/Repos/BaseRepo.php +++ b/app/Entities/Repos/BaseRepo.php @@ -4,6 +4,7 @@ namespace BookStack\Entities\Repos; use BookStack\Actions\ActivityType; use BookStack\Actions\TagRepo; +use BookStack\Auth\User; use BookStack\Entities\Models\Entity; use BookStack\Entities\Models\HasCoverImage; use BookStack\Exceptions\ImageUploadException; @@ -89,30 +90,4 @@ class BaseRepo $entity->save(); } } - - /** - * Update the permissions of an entity. - */ - public function updatePermissions(Entity $entity, bool $restricted, Collection $permissions = null) - { - $entity->restricted = $restricted; - $entity->permissions()->delete(); - - if (!is_null($permissions)) { - $entityPermissionData = $permissions->flatMap(function ($restrictions, $roleId) { - return collect($restrictions)->keys()->map(function ($action) use ($roleId) { - return [ - 'role_id' => $roleId, - 'action' => strtolower($action), - ] ; - }); - }); - - $entity->permissions()->createMany($entityPermissionData); - } - - $entity->save(); - $entity->rebuildPermissions(); - Activity::addForEntity($entity, ActivityType::PERMISSIONS_UPDATE); - } } diff --git a/app/Entities/Repos/BookRepo.php b/app/Entities/Repos/BookRepo.php index d6dbe0b73..68d62887b 100644 --- a/app/Entities/Repos/BookRepo.php +++ b/app/Entities/Repos/BookRepo.php @@ -114,14 +114,6 @@ class BookRepo $this->baseRepo->updateCoverImage($book, $coverImage, $removeImage); } - /** - * Update the permissions of a book. - */ - public function updatePermissions(Book $book, bool $restricted, Collection $permissions = null) - { - $this->baseRepo->updatePermissions($book, $restricted, $permissions); - } - /** * Remove a book from the system. * @throws Exception diff --git a/app/Entities/Repos/BookshelfRepo.php b/app/Entities/Repos/BookshelfRepo.php index 075582cbf..b15241fb3 100644 --- a/app/Entities/Repos/BookshelfRepo.php +++ b/app/Entities/Repos/BookshelfRepo.php @@ -137,14 +137,6 @@ class BookshelfRepo $this->baseRepo->updateCoverImage($shelf, $coverImage, $removeImage); } - /** - * Update the permissions of a bookshelf. - */ - public function updatePermissions(Bookshelf $shelf, bool $restricted, Collection $permissions = null) - { - $this->baseRepo->updatePermissions($shelf, $restricted, $permissions); - } - /** * Copy down the permissions of the given shelf to all child books. */ diff --git a/app/Entities/Repos/ChapterRepo.php b/app/Entities/Repos/ChapterRepo.php index 281cc2cab..d56874e0d 100644 --- a/app/Entities/Repos/ChapterRepo.php +++ b/app/Entities/Repos/ChapterRepo.php @@ -62,14 +62,6 @@ class ChapterRepo return $chapter; } - /** - * Update the permissions of a chapter. - */ - public function updatePermissions(Chapter $chapter, bool $restricted, Collection $permissions = null) - { - $this->baseRepo->updatePermissions($chapter, $restricted, $permissions); - } - /** * Remove a chapter from the system. * @throws Exception diff --git a/app/Entities/Repos/PageRepo.php b/app/Entities/Repos/PageRepo.php index f664d2126..8840c06db 100644 --- a/app/Entities/Repos/PageRepo.php +++ b/app/Entities/Repos/PageRepo.php @@ -383,14 +383,6 @@ class PageRepo return $parentClass::visible()->where('id', '=', $entityId)->first(); } - /** - * Update the permissions of a page. - */ - public function updatePermissions(Page $page, bool $restricted, Collection $permissions = null) - { - $this->baseRepo->updatePermissions($page, $restricted, $permissions); - } - /** * Change the page's parent to the given entity. */ diff --git a/app/Entities/Tools/PermissionsUpdater.php b/app/Entities/Tools/PermissionsUpdater.php new file mode 100644 index 000000000..bbf0cba96 --- /dev/null +++ b/app/Entities/Tools/PermissionsUpdater.php @@ -0,0 +1,68 @@ +<?php namespace BookStack\Entities\Tools; + +use BookStack\Actions\ActivityType; +use BookStack\Auth\User; +use BookStack\Entities\Models\Entity; +use BookStack\Facades\Activity; +use Illuminate\Http\Request; +use Illuminate\Support\Collection; + +class PermissionsUpdater +{ + + /** + * Update an entities permissions from a permission form submit request. + */ + public function updateFromPermissionsForm(Entity $entity, Request $request) + { + $restricted = $request->get('restricted') === 'true'; + $permissions = $request->get('restrictions', null); + $ownerId = $request->get('owned_by', null); + + $entity->restricted = $restricted; + $entity->permissions()->delete(); + + if (!is_null($permissions)) { + $entityPermissionData = $this->formatPermissionsFromRequestToEntityPermissions($permissions); + $entity->permissions()->createMany($entityPermissionData); + } + + if (!is_null($ownerId)) { + $this->updateOwnerFromId($entity, $ownerId); + } + + $entity->save(); + $entity->rebuildPermissions(); + + Activity::addForEntity($entity, ActivityType::PERMISSIONS_UPDATE); + } + + /** + * Update the owner of the given entity. + * Checks the user exists in the system first. + * Does not save the model, just updates it. + */ + protected function updateOwnerFromId(Entity $entity, int $newOwnerId) + { + $newOwner = User::query()->find($newOwnerId); + if (!is_null($newOwner)) { + $entity->owned_by = $newOwner->id; + } + } + + /** + * Format permissions provided from a permission form to be + * EntityPermission data. + */ + protected function formatPermissionsFromRequestToEntityPermissions(array $permissions): Collection + { + return collect($permissions)->flatMap(function ($restrictions, $roleId) { + return collect($restrictions)->keys()->map(function ($action) use ($roleId) { + return [ + 'role_id' => $roleId, + 'action' => strtolower($action), + ] ; + }); + }); + } +} diff --git a/app/Http/Controllers/BookController.php b/app/Http/Controllers/BookController.php index b63fe911f..3d695ba85 100644 --- a/app/Http/Controllers/BookController.php +++ b/app/Http/Controllers/BookController.php @@ -4,6 +4,7 @@ use Activity; use BookStack\Actions\ActivityType; use BookStack\Entities\Tools\BookContents; use BookStack\Entities\Models\Bookshelf; +use BookStack\Entities\Tools\PermissionsUpdater; use BookStack\Entities\Tools\ShelfContext; use BookStack\Entities\Repos\BookRepo; use BookStack\Exceptions\ImageUploadException; @@ -202,14 +203,12 @@ class BookController extends Controller * Set the restrictions for this book. * @throws Throwable */ - public function permissions(Request $request, string $bookSlug) + public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $bookSlug) { $book = $this->bookRepo->getBySlug($bookSlug); $this->checkOwnablePermission('restrictions-manage', $book); - $restricted = $request->get('restricted') === 'true'; - $permissions = $request->filled('restrictions') ? collect($request->get('restrictions')) : null; - $this->bookRepo->updatePermissions($book, $restricted, $permissions); + $permissionsUpdater->updateFromPermissionsForm($book, $request); $this->showSuccessNotification(trans('entities.books_permissions_updated')); return redirect($book->getUrl()); diff --git a/app/Http/Controllers/BookshelfController.php b/app/Http/Controllers/BookshelfController.php index 50dc97bab..32c22e185 100644 --- a/app/Http/Controllers/BookshelfController.php +++ b/app/Http/Controllers/BookshelfController.php @@ -2,6 +2,7 @@ use Activity; use BookStack\Entities\Models\Book; +use BookStack\Entities\Tools\PermissionsUpdater; use BookStack\Entities\Tools\ShelfContext; use BookStack\Entities\Repos\BookshelfRepo; use BookStack\Exceptions\ImageUploadException; @@ -19,9 +20,6 @@ class BookshelfController extends Controller protected $entityContextManager; protected $imageRepo; - /** - * BookController constructor. - */ public function __construct(BookshelfRepo $bookshelfRepo, ShelfContext $entityContextManager, ImageRepo $imageRepo) { $this->bookshelfRepo = $bookshelfRepo; @@ -200,14 +198,12 @@ class BookshelfController extends Controller /** * Set the permissions for this bookshelf. */ - public function permissions(Request $request, string $slug) + public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $slug) { $shelf = $this->bookshelfRepo->getBySlug($slug); $this->checkOwnablePermission('restrictions-manage', $shelf); - $restricted = $request->get('restricted') === 'true'; - $permissions = $request->filled('restrictions') ? collect($request->get('restrictions')) : null; - $this->bookshelfRepo->updatePermissions($shelf, $restricted, $permissions); + $permissionsUpdater->updateFromPermissionsForm($shelf, $request); $this->showSuccessNotification(trans('entities.shelves_permissions_updated')); return redirect($shelf->getUrl()); diff --git a/app/Http/Controllers/ChapterController.php b/app/Http/Controllers/ChapterController.php index 0059f202b..1d69df2a2 100644 --- a/app/Http/Controllers/ChapterController.php +++ b/app/Http/Controllers/ChapterController.php @@ -3,6 +3,7 @@ use BookStack\Entities\Models\Book; use BookStack\Entities\Tools\BookContents; use BookStack\Entities\Repos\ChapterRepo; +use BookStack\Entities\Tools\PermissionsUpdater; use BookStack\Exceptions\MoveOperationException; use BookStack\Exceptions\NotFoundException; use Illuminate\Http\Request; @@ -190,14 +191,12 @@ class ChapterController extends Controller * Set the restrictions for this chapter. * @throws NotFoundException */ - public function permissions(Request $request, string $bookSlug, string $chapterSlug) + public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $bookSlug, string $chapterSlug) { $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug); $this->checkOwnablePermission('restrictions-manage', $chapter); - $restricted = $request->get('restricted') === 'true'; - $permissions = $request->filled('restrictions') ? collect($request->get('restrictions')) : null; - $this->chapterRepo->updatePermissions($chapter, $restricted, $permissions); + $permissionsUpdater->updateFromPermissionsForm($chapter, $request); $this->showSuccessNotification(trans('entities.chapters_permissions_success')); return redirect($chapter->getUrl()); diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 67d28a78a..7d8e54382 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -5,6 +5,7 @@ use BookStack\Entities\Tools\PageContent; use BookStack\Entities\Tools\PageEditActivity; use BookStack\Entities\Models\Page; use BookStack\Entities\Repos\PageRepo; +use BookStack\Entities\Tools\PermissionsUpdater; use BookStack\Exceptions\NotFoundException; use BookStack\Exceptions\NotifyException; use BookStack\Exceptions\PermissionsException; @@ -453,14 +454,12 @@ class PageController extends Controller * @throws NotFoundException * @throws Throwable */ - public function permissions(Request $request, string $bookSlug, string $pageSlug) + public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $bookSlug, string $pageSlug) { $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); $this->checkOwnablePermission('restrictions-manage', $page); - $restricted = $request->get('restricted') === 'true'; - $permissions = $request->filled('restrictions') ? collect($request->get('restrictions')) : null; - $this->pageRepo->updatePermissions($page, $restricted, $permissions); + $permissionsUpdater->updateFromPermissionsForm($page, $request); $this->showSuccessNotification(trans('entities.pages_permissions_success')); return redirect($page->getUrl()); diff --git a/app/Http/Controllers/UserSearchController.php b/app/Http/Controllers/UserSearchController.php index f12f09fff..a0dfbd8d0 100644 --- a/app/Http/Controllers/UserSearchController.php +++ b/app/Http/Controllers/UserSearchController.php @@ -19,7 +19,7 @@ class UserSearchController extends Controller ->take(20); if (!empty($search)) { - $query->where(function(Builder $query) use ($search) { + $query->where(function (Builder $query) use ($search) { $query->where('email', 'like', '%' . $search . '%') ->orWhere('name', 'like', '%' . $search . '%'); });