mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-10-01 01:36:00 -04:00
Reorgranised permission routes into their own controller
Also introduced helpers for getting entities by slugs since we do it in so many places.
This commit is contained in:
parent
06a7f1b54a
commit
bf591765c1
@ -3,7 +3,7 @@
|
|||||||
namespace BookStack\Console\Commands;
|
namespace BookStack\Console\Commands;
|
||||||
|
|
||||||
use BookStack\Entities\Models\Bookshelf;
|
use BookStack\Entities\Models\Bookshelf;
|
||||||
use BookStack\Entities\Repos\BookshelfRepo;
|
use BookStack\Entities\Tools\PermissionsUpdater;
|
||||||
use Illuminate\Console\Command;
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
class CopyShelfPermissions extends Command
|
class CopyShelfPermissions extends Command
|
||||||
@ -25,19 +25,16 @@ class CopyShelfPermissions extends Command
|
|||||||
*/
|
*/
|
||||||
protected $description = 'Copy shelf permissions to all child books';
|
protected $description = 'Copy shelf permissions to all child books';
|
||||||
|
|
||||||
/**
|
protected PermissionsUpdater $permissionsUpdater;
|
||||||
* @var BookshelfRepo
|
|
||||||
*/
|
|
||||||
protected $bookshelfRepo;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new command instance.
|
* Create a new command instance.
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function __construct(BookshelfRepo $repo)
|
public function __construct(PermissionsUpdater $permissionsUpdater)
|
||||||
{
|
{
|
||||||
$this->bookshelfRepo = $repo;
|
$this->permissionsUpdater = $permissionsUpdater;
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +77,7 @@ class CopyShelfPermissions extends Command
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach ($shelves as $shelf) {
|
foreach ($shelves as $shelf) {
|
||||||
$this->bookshelfRepo->copyDownPermissions($shelf, false);
|
$this->permissionsUpdater->updateBookPermissionsFromShelf($shelf, false);
|
||||||
$this->info('Copied permissions for shelf [' . $shelf->id . ']');
|
$this->info('Copied permissions for shelf [' . $shelf->id . ']');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,4 +120,13 @@ class Book extends Entity implements HasCoverImage
|
|||||||
|
|
||||||
return $pages->concat($chapters)->sortBy('priority')->sortByDesc('draft');
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -109,4 +109,13 @@ class Bookshelf extends Entity implements HasCoverImage
|
|||||||
$maxOrder = $this->books()->max('order');
|
$maxOrder = $this->books()->max('order');
|
||||||
$this->books()->attach($book->id, ['order' => $maxOrder + 1]);
|
$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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -58,4 +58,13 @@ class Chapter extends BookChild
|
|||||||
->orderBy('priority', 'asc')
|
->orderBy('priority', 'asc')
|
||||||
->get();
|
->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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -145,4 +145,13 @@ class Page extends BookChild
|
|||||||
|
|
||||||
return $refreshed;
|
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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -134,31 +134,6 @@ class BookshelfRepo
|
|||||||
$shelf->books()->sync($syncData);
|
$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.
|
* Remove a bookshelf from the system.
|
||||||
*
|
*
|
||||||
|
@ -5,6 +5,8 @@ namespace BookStack\Entities\Tools;
|
|||||||
use BookStack\Actions\ActivityType;
|
use BookStack\Actions\ActivityType;
|
||||||
use BookStack\Auth\Permissions\EntityPermission;
|
use BookStack\Auth\Permissions\EntityPermission;
|
||||||
use BookStack\Auth\User;
|
use BookStack\Auth\User;
|
||||||
|
use BookStack\Entities\Models\Book;
|
||||||
|
use BookStack\Entities\Models\Bookshelf;
|
||||||
use BookStack\Entities\Models\Entity;
|
use BookStack\Entities\Models\Entity;
|
||||||
use BookStack\Facades\Activity;
|
use BookStack\Facades\Activity;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
@ -67,4 +69,30 @@ class PermissionsUpdater
|
|||||||
|
|
||||||
return $formatted;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@ use BookStack\Entities\Repos\BookRepo;
|
|||||||
use BookStack\Entities\Tools\BookContents;
|
use BookStack\Entities\Tools\BookContents;
|
||||||
use BookStack\Entities\Tools\Cloner;
|
use BookStack\Entities\Tools\Cloner;
|
||||||
use BookStack\Entities\Tools\HierarchyTransformer;
|
use BookStack\Entities\Tools\HierarchyTransformer;
|
||||||
use BookStack\Entities\Tools\PermissionsUpdater;
|
|
||||||
use BookStack\Entities\Tools\ShelfContext;
|
use BookStack\Entities\Tools\ShelfContext;
|
||||||
use BookStack\Exceptions\ImageUploadException;
|
use BookStack\Exceptions\ImageUploadException;
|
||||||
use BookStack\Exceptions\NotFoundException;
|
use BookStack\Exceptions\NotFoundException;
|
||||||
@ -209,36 +208,6 @@ class BookController extends Controller
|
|||||||
return redirect('/books');
|
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.
|
* Show the view to copy a book.
|
||||||
*
|
*
|
||||||
|
@ -6,7 +6,6 @@ use BookStack\Actions\ActivityQueries;
|
|||||||
use BookStack\Actions\View;
|
use BookStack\Actions\View;
|
||||||
use BookStack\Entities\Models\Book;
|
use BookStack\Entities\Models\Book;
|
||||||
use BookStack\Entities\Repos\BookshelfRepo;
|
use BookStack\Entities\Repos\BookshelfRepo;
|
||||||
use BookStack\Entities\Tools\PermissionsUpdater;
|
|
||||||
use BookStack\Entities\Tools\ShelfContext;
|
use BookStack\Entities\Tools\ShelfContext;
|
||||||
use BookStack\Exceptions\ImageUploadException;
|
use BookStack\Exceptions\ImageUploadException;
|
||||||
use BookStack\Exceptions\NotFoundException;
|
use BookStack\Exceptions\NotFoundException;
|
||||||
@ -207,46 +206,4 @@ class BookshelfController extends Controller
|
|||||||
|
|
||||||
return redirect('/shelves');
|
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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ use BookStack\Entities\Tools\BookContents;
|
|||||||
use BookStack\Entities\Tools\Cloner;
|
use BookStack\Entities\Tools\Cloner;
|
||||||
use BookStack\Entities\Tools\HierarchyTransformer;
|
use BookStack\Entities\Tools\HierarchyTransformer;
|
||||||
use BookStack\Entities\Tools\NextPreviousContentLocator;
|
use BookStack\Entities\Tools\NextPreviousContentLocator;
|
||||||
use BookStack\Entities\Tools\PermissionsUpdater;
|
|
||||||
use BookStack\Exceptions\MoveOperationException;
|
use BookStack\Exceptions\MoveOperationException;
|
||||||
use BookStack\Exceptions\NotFoundException;
|
use BookStack\Exceptions\NotFoundException;
|
||||||
use BookStack\Exceptions\PermissionsException;
|
use BookStack\Exceptions\PermissionsException;
|
||||||
@ -243,38 +242,6 @@ class ChapterController extends Controller
|
|||||||
return redirect($chapterCopy->getUrl());
|
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.
|
* Convert the chapter to a book.
|
||||||
*/
|
*/
|
||||||
|
@ -11,7 +11,6 @@ use BookStack\Entities\Tools\NextPreviousContentLocator;
|
|||||||
use BookStack\Entities\Tools\PageContent;
|
use BookStack\Entities\Tools\PageContent;
|
||||||
use BookStack\Entities\Tools\PageEditActivity;
|
use BookStack\Entities\Tools\PageEditActivity;
|
||||||
use BookStack\Entities\Tools\PageEditorData;
|
use BookStack\Entities\Tools\PageEditorData;
|
||||||
use BookStack\Entities\Tools\PermissionsUpdater;
|
|
||||||
use BookStack\Exceptions\NotFoundException;
|
use BookStack\Exceptions\NotFoundException;
|
||||||
use BookStack\Exceptions\PermissionsException;
|
use BookStack\Exceptions\PermissionsException;
|
||||||
use BookStack\References\ReferenceFetcher;
|
use BookStack\References\ReferenceFetcher;
|
||||||
@ -452,37 +451,4 @@ class PageController extends Controller
|
|||||||
|
|
||||||
return redirect($pageCopy->getUrl());
|
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());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
146
app/Http/Controllers/PermissionsController.php
Normal file
146
app/Http/Controllers/PermissionsController.php
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
<?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());
|
||||||
|
}
|
||||||
|
}
|
@ -22,8 +22,7 @@ class ReferenceController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function page(string $bookSlug, string $pageSlug)
|
public function page(string $bookSlug, string $pageSlug)
|
||||||
{
|
{
|
||||||
/** @var Page $page */
|
$page = Page::getBySlugs($bookSlug, $pageSlug);
|
||||||
$page = Page::visible()->whereSlugs($bookSlug, $pageSlug)->firstOrFail();
|
|
||||||
$references = $this->referenceFetcher->getPageReferencesToEntity($page);
|
$references = $this->referenceFetcher->getPageReferencesToEntity($page);
|
||||||
|
|
||||||
return view('pages.references', [
|
return view('pages.references', [
|
||||||
@ -37,8 +36,7 @@ class ReferenceController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function chapter(string $bookSlug, string $chapterSlug)
|
public function chapter(string $bookSlug, string $chapterSlug)
|
||||||
{
|
{
|
||||||
/** @var Chapter $chapter */
|
$chapter = Chapter::getBySlugs($bookSlug, $chapterSlug);
|
||||||
$chapter = Chapter::visible()->whereSlugs($bookSlug, $chapterSlug)->firstOrFail();
|
|
||||||
$references = $this->referenceFetcher->getPageReferencesToEntity($chapter);
|
$references = $this->referenceFetcher->getPageReferencesToEntity($chapter);
|
||||||
|
|
||||||
return view('chapters.references', [
|
return view('chapters.references', [
|
||||||
@ -52,7 +50,7 @@ class ReferenceController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function book(string $slug)
|
public function book(string $slug)
|
||||||
{
|
{
|
||||||
$book = Book::visible()->where('slug', '=', $slug)->firstOrFail();
|
$book = Book::getBySlug($slug);
|
||||||
$references = $this->referenceFetcher->getPageReferencesToEntity($book);
|
$references = $this->referenceFetcher->getPageReferencesToEntity($book);
|
||||||
|
|
||||||
return view('books.references', [
|
return view('books.references', [
|
||||||
@ -66,7 +64,7 @@ class ReferenceController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function shelf(string $slug)
|
public function shelf(string $slug)
|
||||||
{
|
{
|
||||||
$shelf = Bookshelf::visible()->where('slug', '=', $slug)->firstOrFail();
|
$shelf = Bookshelf::getBySlug($slug);
|
||||||
$references = $this->referenceFetcher->getPageReferencesToEntity($shelf);
|
$references = $this->referenceFetcher->getPageReferencesToEntity($shelf);
|
||||||
|
|
||||||
return view('shelves.references', [
|
return view('shelves.references', [
|
||||||
|
@ -19,6 +19,7 @@ use BookStack\Http\Controllers\PageController;
|
|||||||
use BookStack\Http\Controllers\PageExportController;
|
use BookStack\Http\Controllers\PageExportController;
|
||||||
use BookStack\Http\Controllers\PageRevisionController;
|
use BookStack\Http\Controllers\PageRevisionController;
|
||||||
use BookStack\Http\Controllers\PageTemplateController;
|
use BookStack\Http\Controllers\PageTemplateController;
|
||||||
|
use BookStack\Http\Controllers\PermissionsController;
|
||||||
use BookStack\Http\Controllers\RecycleBinController;
|
use BookStack\Http\Controllers\RecycleBinController;
|
||||||
use BookStack\Http\Controllers\ReferenceController;
|
use BookStack\Http\Controllers\ReferenceController;
|
||||||
use BookStack\Http\Controllers\RoleController;
|
use BookStack\Http\Controllers\RoleController;
|
||||||
@ -61,9 +62,9 @@ Route::middleware('auth')->group(function () {
|
|||||||
Route::get('/shelves/{slug}', [BookshelfController::class, 'show']);
|
Route::get('/shelves/{slug}', [BookshelfController::class, 'show']);
|
||||||
Route::put('/shelves/{slug}', [BookshelfController::class, 'update']);
|
Route::put('/shelves/{slug}', [BookshelfController::class, 'update']);
|
||||||
Route::delete('/shelves/{slug}', [BookshelfController::class, 'destroy']);
|
Route::delete('/shelves/{slug}', [BookshelfController::class, 'destroy']);
|
||||||
Route::get('/shelves/{slug}/permissions', [BookshelfController::class, 'showPermissions']);
|
Route::get('/shelves/{slug}/permissions', [PermissionsController::class, 'showForShelf']);
|
||||||
Route::put('/shelves/{slug}/permissions', [BookshelfController::class, 'permissions']);
|
Route::put('/shelves/{slug}/permissions', [PermissionsController::class, 'updateForShelf']);
|
||||||
Route::post('/shelves/{slug}/copy-permissions', [BookshelfController::class, 'copyPermissions']);
|
Route::post('/shelves/{slug}/copy-permissions', [PermissionsController::class, 'copyShelfPermissionsToBooks']);
|
||||||
Route::get('/shelves/{slug}/references', [ReferenceController::class, 'shelf']);
|
Route::get('/shelves/{slug}/references', [ReferenceController::class, 'shelf']);
|
||||||
|
|
||||||
// Book Creation
|
// Book Creation
|
||||||
@ -79,8 +80,8 @@ Route::middleware('auth')->group(function () {
|
|||||||
Route::delete('/books/{id}', [BookController::class, 'destroy']);
|
Route::delete('/books/{id}', [BookController::class, 'destroy']);
|
||||||
Route::get('/books/{slug}/sort-item', [BookSortController::class, 'showItem']);
|
Route::get('/books/{slug}/sort-item', [BookSortController::class, 'showItem']);
|
||||||
Route::get('/books/{slug}', [BookController::class, 'show']);
|
Route::get('/books/{slug}', [BookController::class, 'show']);
|
||||||
Route::get('/books/{bookSlug}/permissions', [BookController::class, 'showPermissions']);
|
Route::get('/books/{bookSlug}/permissions', [PermissionsController::class, 'showForBook']);
|
||||||
Route::put('/books/{bookSlug}/permissions', [BookController::class, 'permissions']);
|
Route::put('/books/{bookSlug}/permissions', [PermissionsController::class, 'updateForBook']);
|
||||||
Route::get('/books/{slug}/delete', [BookController::class, 'showDelete']);
|
Route::get('/books/{slug}/delete', [BookController::class, 'showDelete']);
|
||||||
Route::get('/books/{bookSlug}/copy', [BookController::class, 'showCopy']);
|
Route::get('/books/{bookSlug}/copy', [BookController::class, 'showCopy']);
|
||||||
Route::post('/books/{bookSlug}/copy', [BookController::class, 'copy']);
|
Route::post('/books/{bookSlug}/copy', [BookController::class, 'copy']);
|
||||||
@ -111,8 +112,8 @@ Route::middleware('auth')->group(function () {
|
|||||||
Route::post('/books/{bookSlug}/page/{pageSlug}/copy', [PageController::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}/page/{pageSlug}/delete', [PageController::class, 'showDelete']);
|
||||||
Route::get('/books/{bookSlug}/draft/{pageId}/delete', [PageController::class, 'showDeleteDraft']);
|
Route::get('/books/{bookSlug}/draft/{pageId}/delete', [PageController::class, 'showDeleteDraft']);
|
||||||
Route::get('/books/{bookSlug}/page/{pageSlug}/permissions', [PageController::class, 'showPermissions']);
|
Route::get('/books/{bookSlug}/page/{pageSlug}/permissions', [PermissionsController::class, 'showForPage']);
|
||||||
Route::put('/books/{bookSlug}/page/{pageSlug}/permissions', [PageController::class, 'permissions']);
|
Route::put('/books/{bookSlug}/page/{pageSlug}/permissions', [PermissionsController::class, 'updateForPage']);
|
||||||
Route::get('/books/{bookSlug}/page/{pageSlug}/references', [ReferenceController::class, 'page']);
|
Route::get('/books/{bookSlug}/page/{pageSlug}/references', [ReferenceController::class, 'page']);
|
||||||
Route::put('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'update']);
|
Route::put('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'update']);
|
||||||
Route::delete('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'destroy']);
|
Route::delete('/books/{bookSlug}/page/{pageSlug}', [PageController::class, 'destroy']);
|
||||||
@ -138,12 +139,12 @@ Route::middleware('auth')->group(function () {
|
|||||||
Route::post('/books/{bookSlug}/chapter/{chapterSlug}/copy', [ChapterController::class, 'copy']);
|
Route::post('/books/{bookSlug}/chapter/{chapterSlug}/copy', [ChapterController::class, 'copy']);
|
||||||
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/edit', [ChapterController::class, 'edit']);
|
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/edit', [ChapterController::class, 'edit']);
|
||||||
Route::post('/books/{bookSlug}/chapter/{chapterSlug}/convert-to-book', [ChapterController::class, 'convertToBook']);
|
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/pdf', [ChapterExportController::class, 'pdf']);
|
||||||
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/html', [ChapterExportController::class, 'html']);
|
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/markdown', [ChapterExportController::class, 'markdown']);
|
||||||
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/export/plaintext', [ChapterExportController::class, 'plainText']);
|
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}/references', [ReferenceController::class, 'chapter']);
|
||||||
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/delete', [ChapterController::class, 'showDelete']);
|
Route::get('/books/{bookSlug}/chapter/{chapterSlug}/delete', [ChapterController::class, 'showDelete']);
|
||||||
Route::delete('/books/{bookSlug}/chapter/{chapterSlug}', [ChapterController::class, 'destroy']);
|
Route::delete('/books/{bookSlug}/chapter/{chapterSlug}', [ChapterController::class, 'destroy']);
|
||||||
|
Loading…
Reference in New Issue
Block a user