namespace BookStack\Console\Commands;
use BookStack\Entities\Models\Bookshelf;
-use BookStack\Entities\Repos\BookshelfRepo;
+use BookStack\Entities\Tools\PermissionsUpdater;
use Illuminate\Console\Command;
class CopyShelfPermissions extends Command
*/
protected $description = 'Copy shelf permissions to all child books';
- /**
- * @var BookshelfRepo
- */
- protected $bookshelfRepo;
+ protected PermissionsUpdater $permissionsUpdater;
/**
* Create a new command instance.
*
* @return void
*/
- public function __construct(BookshelfRepo $repo)
+ public function __construct(PermissionsUpdater $permissionsUpdater)
{
- $this->bookshelfRepo = $repo;
+ $this->permissionsUpdater = $permissionsUpdater;
parent::__construct();
}
}
foreach ($shelves as $shelf) {
- $this->bookshelfRepo->copyDownPermissions($shelf, false);
+ $this->permissionsUpdater->updateBookPermissionsFromShelf($shelf, false);
$this->info('Copied permissions for shelf [' . $shelf->id . ']');
}
return $pages->concat($chapters)->sortBy('priority')->sortByDesc('draft');
}
+
+ /**
+ * Get a visible book by its slug.
+ * @throws \Illuminate\Database\Eloquent\ModelNotFoundException
+ */
+ public static function getBySlug(string $slug): self
+ {
+ return static::visible()->where('slug', '=', $slug)->firstOrFail();
+ }
}
$maxOrder = $this->books()->max('order');
$this->books()->attach($book->id, ['order' => $maxOrder + 1]);
}
+
+ /**
+ * Get a visible shelf by its slug.
+ * @throws \Illuminate\Database\Eloquent\ModelNotFoundException
+ */
+ public static function getBySlug(string $slug): self
+ {
+ return static::visible()->where('slug', '=', $slug)->firstOrFail();
+ }
}
->orderBy('priority', 'asc')
->get();
}
+
+ /**
+ * Get a visible chapter by its book and page slugs.
+ * @throws \Illuminate\Database\Eloquent\ModelNotFoundException
+ */
+ public static function getBySlugs(string $bookSlug, string $chapterSlug): self
+ {
+ return static::visible()->whereSlugs($bookSlug, $chapterSlug)->firstOrFail();
+ }
}
return $refreshed;
}
+
+ /**
+ * Get a visible page by its book and page slugs.
+ * @throws \Illuminate\Database\Eloquent\ModelNotFoundException
+ */
+ public static function getBySlugs(string $bookSlug, string $pageSlug): self
+ {
+ return static::visible()->whereSlugs($bookSlug, $pageSlug)->firstOrFail();
+ }
}
$shelf->books()->sync($syncData);
}
- /**
- * Copy down the permissions of the given shelf to all child books.
- */
- public function copyDownPermissions(Bookshelf $shelf, $checkUserPermissions = true): int
- {
- $shelfPermissions = $shelf->permissions()->get(['role_id', 'view', 'create', 'update', 'delete'])->toArray();
- $shelfBooks = $shelf->books()->get(['id', 'restricted', 'owned_by']);
- $updatedBookCount = 0;
-
- /** @var Book $book */
- foreach ($shelfBooks as $book) {
- if ($checkUserPermissions && !userCan('restrictions-manage', $book)) {
- continue;
- }
- $book->permissions()->delete();
- $book->restricted = $shelf->restricted;
- $book->permissions()->createMany($shelfPermissions);
- $book->save();
- $book->rebuildPermissions();
- $updatedBookCount++;
- }
-
- return $updatedBookCount;
- }
-
/**
* Remove a bookshelf from the system.
*
use BookStack\Actions\ActivityType;
use BookStack\Auth\Permissions\EntityPermission;
use BookStack\Auth\User;
+use BookStack\Entities\Models\Book;
+use BookStack\Entities\Models\Bookshelf;
use BookStack\Entities\Models\Entity;
use BookStack\Facades\Activity;
use Illuminate\Http\Request;
return $formatted;
}
+
+ /**
+ * Copy down the permissions of the given shelf to all child books.
+ */
+ public function updateBookPermissionsFromShelf(Bookshelf $shelf, $checkUserPermissions = true): int
+ {
+ // TODO - Fix for new format
+ $shelfPermissions = $shelf->permissions()->get(['role_id', 'view', 'create', 'update', 'delete'])->toArray();
+ $shelfBooks = $shelf->books()->get(['id', 'restricted', 'owned_by']);
+ $updatedBookCount = 0;
+
+ /** @var Book $book */
+ foreach ($shelfBooks as $book) {
+ if ($checkUserPermissions && !userCan('restrictions-manage', $book)) {
+ continue;
+ }
+ $book->permissions()->delete();
+ $book->restricted = $shelf->restricted;
+ $book->permissions()->createMany($shelfPermissions);
+ $book->save();
+ $book->rebuildPermissions();
+ $updatedBookCount++;
+ }
+
+ return $updatedBookCount;
+ }
}
use BookStack\Entities\Tools\BookContents;
use BookStack\Entities\Tools\Cloner;
use BookStack\Entities\Tools\HierarchyTransformer;
-use BookStack\Entities\Tools\PermissionsUpdater;
use BookStack\Entities\Tools\ShelfContext;
use BookStack\Exceptions\ImageUploadException;
use BookStack\Exceptions\NotFoundException;
return redirect('/books');
}
- /**
- * Show the permissions view.
- */
- public function showPermissions(string $bookSlug)
- {
- $book = $this->bookRepo->getBySlug($bookSlug);
- $this->checkOwnablePermission('restrictions-manage', $book);
-
- return view('books.permissions', [
- 'book' => $book,
- ]);
- }
-
- /**
- * Set the restrictions for this book.
- *
- * @throws Throwable
- */
- public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $bookSlug)
- {
- $book = $this->bookRepo->getBySlug($bookSlug);
- $this->checkOwnablePermission('restrictions-manage', $book);
-
- $permissionsUpdater->updateFromPermissionsForm($book, $request);
-
- $this->showSuccessNotification(trans('entities.books_permissions_updated'));
-
- return redirect($book->getUrl());
- }
-
/**
* Show the view to copy a book.
*
use BookStack\Actions\View;
use BookStack\Entities\Models\Book;
use BookStack\Entities\Repos\BookshelfRepo;
-use BookStack\Entities\Tools\PermissionsUpdater;
use BookStack\Entities\Tools\ShelfContext;
use BookStack\Exceptions\ImageUploadException;
use BookStack\Exceptions\NotFoundException;
return redirect('/shelves');
}
-
- /**
- * Show the permissions view.
- */
- public function showPermissions(string $slug)
- {
- $shelf = $this->shelfRepo->getBySlug($slug);
- $this->checkOwnablePermission('restrictions-manage', $shelf);
-
- return view('shelves.permissions', [
- 'shelf' => $shelf,
- ]);
- }
-
- /**
- * Set the permissions for this bookshelf.
- */
- public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $slug)
- {
- $shelf = $this->shelfRepo->getBySlug($slug);
- $this->checkOwnablePermission('restrictions-manage', $shelf);
-
- $permissionsUpdater->updateFromPermissionsForm($shelf, $request);
-
- $this->showSuccessNotification(trans('entities.shelves_permissions_updated'));
-
- return redirect($shelf->getUrl());
- }
-
- /**
- * Copy the permissions of a bookshelf to the child books.
- */
- public function copyPermissions(string $slug)
- {
- $shelf = $this->shelfRepo->getBySlug($slug);
- $this->checkOwnablePermission('restrictions-manage', $shelf);
-
- $updateCount = $this->shelfRepo->copyDownPermissions($shelf);
- $this->showSuccessNotification(trans('entities.shelves_copy_permission_success', ['count' => $updateCount]));
-
- return redirect($shelf->getUrl());
- }
}
use BookStack\Entities\Tools\Cloner;
use BookStack\Entities\Tools\HierarchyTransformer;
use BookStack\Entities\Tools\NextPreviousContentLocator;
-use BookStack\Entities\Tools\PermissionsUpdater;
use BookStack\Exceptions\MoveOperationException;
use BookStack\Exceptions\NotFoundException;
use BookStack\Exceptions\PermissionsException;
return redirect($chapterCopy->getUrl());
}
- /**
- * Show the Restrictions view.
- *
- * @throws NotFoundException
- */
- public function showPermissions(string $bookSlug, string $chapterSlug)
- {
- $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug);
- $this->checkOwnablePermission('restrictions-manage', $chapter);
-
- return view('chapters.permissions', [
- 'chapter' => $chapter,
- ]);
- }
-
- /**
- * Set the restrictions for this chapter.
- *
- * @throws NotFoundException
- */
- public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $bookSlug, string $chapterSlug)
- {
- $chapter = $this->chapterRepo->getBySlug($bookSlug, $chapterSlug);
- $this->checkOwnablePermission('restrictions-manage', $chapter);
-
- $permissionsUpdater->updateFromPermissionsForm($chapter, $request);
-
- $this->showSuccessNotification(trans('entities.chapters_permissions_success'));
-
- return redirect($chapter->getUrl());
- }
-
/**
* Convert the chapter to a book.
*/
use BookStack\Entities\Tools\PageContent;
use BookStack\Entities\Tools\PageEditActivity;
use BookStack\Entities\Tools\PageEditorData;
-use BookStack\Entities\Tools\PermissionsUpdater;
use BookStack\Exceptions\NotFoundException;
use BookStack\Exceptions\PermissionsException;
use BookStack\References\ReferenceFetcher;
return redirect($pageCopy->getUrl());
}
-
- /**
- * Show the Permissions view.
- *
- * @throws NotFoundException
- */
- public function showPermissions(string $bookSlug, string $pageSlug)
- {
- $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
- $this->checkOwnablePermission('restrictions-manage', $page);
-
- return view('pages.permissions', [
- 'page' => $page,
- ]);
- }
-
- /**
- * Set the permissions for this page.
- *
- * @throws NotFoundException
- * @throws Throwable
- */
- public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $bookSlug, string $pageSlug)
- {
- $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
- $this->checkOwnablePermission('restrictions-manage', $page);
-
- $permissionsUpdater->updateFromPermissionsForm($page, $request);
-
- $this->showSuccessNotification(trans('entities.pages_permissions_success'));
-
- return redirect($page->getUrl());
- }
}
--- /dev/null
+<?php
+
+namespace BookStack\Http\Controllers;
+
+use BookStack\Entities\Models\Book;
+use BookStack\Entities\Models\Bookshelf;
+use BookStack\Entities\Models\Chapter;
+use BookStack\Entities\Models\Page;
+use BookStack\Entities\Tools\PermissionsUpdater;
+use Illuminate\Http\Request;
+
+class PermissionsController extends Controller
+{
+ protected PermissionsUpdater $permissionsUpdater;
+
+ public function __construct(PermissionsUpdater $permissionsUpdater)
+ {
+ $this->permissionsUpdater = $permissionsUpdater;
+ }
+
+ /**
+ * Show the Permissions view for a page.
+ */
+ public function showForPage(string $bookSlug, string $pageSlug)
+ {
+ $page = Page::getBySlugs($bookSlug, $pageSlug);
+ $this->checkOwnablePermission('restrictions-manage', $page);
+
+ return view('pages.permissions', [
+ 'page' => $page,
+ ]);
+ }
+
+ /**
+ * Set the permissions for a page.
+ */
+ public function updateForPage(Request $request, string $bookSlug, string $pageSlug)
+ {
+ $page = Page::getBySlugs($bookSlug, $pageSlug);
+ $this->checkOwnablePermission('restrictions-manage', $page);
+
+ $this->permissionsUpdater->updateFromPermissionsForm($page, $request);
+
+ $this->showSuccessNotification(trans('entities.pages_permissions_success'));
+
+ return redirect($page->getUrl());
+ }
+
+ /**
+ * Show the Restrictions view for a chapter.
+ */
+ public function showForChapter(string $bookSlug, string $chapterSlug)
+ {
+ $chapter = Chapter::getBySlugs($bookSlug, $chapterSlug);
+ $this->checkOwnablePermission('restrictions-manage', $chapter);
+
+ return view('chapters.permissions', [
+ 'chapter' => $chapter,
+ ]);
+ }
+
+ /**
+ * Set the restrictions for a chapter.
+ */
+ public function updateForChapter(Request $request, string $bookSlug, string $chapterSlug)
+ {
+ $chapter = Chapter::getBySlugs($bookSlug, $chapterSlug);
+ $this->checkOwnablePermission('restrictions-manage', $chapter);
+
+ $this->permissionsUpdater->updateFromPermissionsForm($chapter, $request);
+
+ $this->showSuccessNotification(trans('entities.chapters_permissions_success'));
+
+ return redirect($chapter->getUrl());
+ }
+
+ /**
+ * Show the permissions view for a book.
+ */
+ public function showForBook(string $slug)
+ {
+ $book = Book::getBySlug($slug);
+ $this->checkOwnablePermission('restrictions-manage', $book);
+
+ return view('books.permissions', [
+ 'book' => $book,
+ ]);
+ }
+
+ /**
+ * Set the restrictions for a book.
+ */
+ public function updateForBook(Request $request, string $slug)
+ {
+ $book = Book::getBySlug($slug);
+ $this->checkOwnablePermission('restrictions-manage', $book);
+
+ $this->permissionsUpdater->updateFromPermissionsForm($book, $request);
+
+ $this->showSuccessNotification(trans('entities.books_permissions_updated'));
+
+ return redirect($book->getUrl());
+ }
+
+ /**
+ * Show the permissions view for a shelf.
+ */
+ public function showForShelf(string $slug)
+ {
+ $shelf = Bookshelf::getBySlug($slug);
+ $this->checkOwnablePermission('restrictions-manage', $shelf);
+
+ return view('shelves.permissions', [
+ 'shelf' => $shelf,
+ ]);
+ }
+
+ /**
+ * Set the permissions for a shelf.
+ */
+ public function updateForShelf(Request $request, string $slug)
+ {
+ $shelf = Bookshelf::getBySlug($slug);
+ $this->checkOwnablePermission('restrictions-manage', $shelf);
+
+ $this->permissionsUpdater->updateFromPermissionsForm($shelf, $request);
+
+ $this->showSuccessNotification(trans('entities.shelves_permissions_updated'));
+
+ return redirect($shelf->getUrl());
+ }
+
+ /**
+ * Copy the permissions of a bookshelf to the child books.
+ */
+ public function copyShelfPermissionsToBooks(string $slug)
+ {
+ $shelf = Bookshelf::getBySlug($slug);
+ $this->checkOwnablePermission('restrictions-manage', $shelf);
+
+ $updateCount = $this->permissionsUpdater->updateBookPermissionsFromShelf($shelf);
+ $this->showSuccessNotification(trans('entities.shelves_copy_permission_success', ['count' => $updateCount]));
+
+ return redirect($shelf->getUrl());
+ }
+}
*/
public function page(string $bookSlug, string $pageSlug)
{
- /** @var Page $page */
- $page = Page::visible()->whereSlugs($bookSlug, $pageSlug)->firstOrFail();
+ $page = Page::getBySlugs($bookSlug, $pageSlug);
$references = $this->referenceFetcher->getPageReferencesToEntity($page);
return view('pages.references', [
*/
public function chapter(string $bookSlug, string $chapterSlug)
{
- /** @var Chapter $chapter */
- $chapter = Chapter::visible()->whereSlugs($bookSlug, $chapterSlug)->firstOrFail();
+ $chapter = Chapter::getBySlugs($bookSlug, $chapterSlug);
$references = $this->referenceFetcher->getPageReferencesToEntity($chapter);
return view('chapters.references', [
*/
public function book(string $slug)
{
- $book = Book::visible()->where('slug', '=', $slug)->firstOrFail();
+ $book = Book::getBySlug($slug);
$references = $this->referenceFetcher->getPageReferencesToEntity($book);
return view('books.references', [
*/
public function shelf(string $slug)
{
- $shelf = Bookshelf::visible()->where('slug', '=', $slug)->firstOrFail();
+ $shelf = Bookshelf::getBySlug($slug);
$references = $this->referenceFetcher->getPageReferencesToEntity($shelf);
return view('shelves.references', [
use BookStack\Http\Controllers\PageExportController;
use BookStack\Http\Controllers\PageRevisionController;
use BookStack\Http\Controllers\PageTemplateController;
+use BookStack\Http\Controllers\PermissionsController;
use BookStack\Http\Controllers\RecycleBinController;
use BookStack\Http\Controllers\ReferenceController;
use BookStack\Http\Controllers\RoleController;
Route::get('/shelves/{slug}', [BookshelfController::class, 'show']);
Route::put('/shelves/{slug}', [BookshelfController::class, 'update']);
Route::delete('/shelves/{slug}', [BookshelfController::class, 'destroy']);
- Route::get('/shelves/{slug}/permissions', [BookshelfController::class, 'showPermissions']);
- Route::put('/shelves/{slug}/permissions', [BookshelfController::class, 'permissions']);
- Route::post('/shelves/{slug}/copy-permissions', [BookshelfController::class, 'copyPermissions']);
+ Route::get('/shelves/{slug}/permissions', [PermissionsController::class, 'showForShelf']);
+ Route::put('/shelves/{slug}/permissions', [PermissionsController::class, 'updateForShelf']);
+ Route::post('/shelves/{slug}/copy-permissions', [PermissionsController::class, 'copyShelfPermissionsToBooks']);
Route::get('/shelves/{slug}/references', [ReferenceController::class, 'shelf']);
// Book Creation
Route::delete('/books/{id}', [BookController::class, 'destroy']);
Route::get('/books/{slug}/sort-item', [BookSortController::class, 'showItem']);
Route::get('/books/{slug}', [BookController::class, 'show']);
- Route::get('/books/{bookSlug}/permissions', [BookController::class, 'showPermissions']);
- Route::put('/books/{bookSlug}/permissions', [BookController::class, 'permissions']);
+ Route::get('/books/{bookSlug}/permissions', [PermissionsController::class, 'showForBook']);
+ Route::put('/books/{bookSlug}/permissions', [PermissionsController::class, 'updateForBook']);
Route::get('/books/{slug}/delete', [BookController::class, 'showDelete']);
Route::get('/books/{bookSlug}/copy', [BookController::class, 'showCopy']);
Route::post('/books/{bookSlug}/copy', [BookController::class, 'copy']);
Route::post('/books/{bookSlug}/page/{pageSlug}/copy', [PageController::class, 'copy']);
Route::get('/books/{bookSlug}/page/{pageSlug}/delete', [PageController::class, 'showDelete']);
Route::get('/books/{bookSlug}/draft/{pageId}/delete', [PageController::class, 'showDeleteDraft']);
- Route::get('/books/{bookSlug}/page/{pageSlug}/permissions', [PageController::class, 'showPermissions']);
- Route::put('/books/{bookSlug}/page/{pageSlug}/permissions', [PageController::class, 'permissions']);
+ Route::get('/books/{bookSlug}/page/{pageSlug}/permissions', [PermissionsController::class, 'showForPage']);
+ Route::put('/books/{bookSlug}/page/{pageSlug}/permissions', [PermissionsController::class, 'updateForPage']);
Route::get('/books/{bookSlug}/page/{pageSlug}/references', [ReferenceController::class, 'page']);
Route::put('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'update']);
Route::delete('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'destroy']);
Route::post('/books/{bookSlug}/chapter/{chapterSlug}/copy', [ChapterController::class, 'copy']);
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/edit', [ChapterController::class, 'edit']);
Route::post('/books/{bookSlug}/chapter/{chapterSlug}/convert-to-book', [ChapterController::class, 'convertToBook']);
- Route::get('/books/{bookSlug}/chapter/{chapterSlug}/permissions', [ChapterController::class, 'showPermissions']);
+ Route::get('/books/{bookSlug}/chapter/{chapterSlug}/permissions', [PermissionsController::class, 'showForPage']);
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/pdf', [ChapterExportController::class, 'pdf']);
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/html', [ChapterExportController::class, 'html']);
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/markdown', [ChapterExportController::class, 'markdown']);
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/plaintext', [ChapterExportController::class, 'plainText']);
- Route::put('/books/{bookSlug}/chapter/{chapterSlug}/permissions', [ChapterController::class, 'permissions']);
+ Route::put('/books/{bookSlug}/chapter/{chapterSlug}/permissions', [PermissionsController::class, 'updateForPage']);
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/references', [ReferenceController::class, 'chapter']);
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/delete', [ChapterController::class, 'showDelete']);
Route::delete('/books/{bookSlug}/chapter/{chapterSlug}', [ChapterController::class, 'destroy']);