X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/d5465726e2ef5f0cf129943abd3701bbc643cb28..refs/pull/3693/head:/app/Http/Controllers/ReferenceController.php diff --git a/app/Http/Controllers/ReferenceController.php b/app/Http/Controllers/ReferenceController.php index bed2c5f30..1daf1818c 100644 --- a/app/Http/Controllers/ReferenceController.php +++ b/app/Http/Controllers/ReferenceController.php @@ -2,18 +2,19 @@ namespace BookStack\Http\Controllers; -use BookStack\Auth\Permissions\PermissionApplicator; +use BookStack\Entities\Models\Book; +use BookStack\Entities\Models\Bookshelf; +use BookStack\Entities\Models\Chapter; use BookStack\Entities\Models\Page; -use Illuminate\Database\Eloquent\Relations\Relation; +use BookStack\References\ReferenceFetcher; class ReferenceController extends Controller { + protected ReferenceFetcher $referenceFetcher; - protected PermissionApplicator $permissions; - - public function __construct(PermissionApplicator $permissions) + public function __construct(ReferenceFetcher $referenceFetcher) { - $this->permissions = $permissions; + $this->referenceFetcher = $referenceFetcher; } /** @@ -23,24 +24,53 @@ class ReferenceController extends Controller { /** @var Page $page */ $page = Page::visible()->whereSlugs($bookSlug, $pageSlug)->firstOrFail(); - - $baseQuery = $page->referencesTo() - ->where('from_type', '=', (new Page())->getMorphClass()) - ->with([ - 'from' => fn(Relation $query) => $query->select(Page::$listAttributes), - 'from.book' => fn(Relation $query) => $query->scopes('visible'), - 'from.chapter' => fn(Relation $query) => $query->scopes('visible') - ]); - - $references = $this->permissions->restrictEntityRelationQuery( - $baseQuery, - 'references', - 'from_id', - 'from_type' - )->get(); + $references = $this->referenceFetcher->getPageReferencesToEntity($page); return view('pages.references', [ - 'page' => $page, + 'page' => $page, + 'references' => $references, + ]); + } + + /** + * Display the references to a given chapter. + */ + public function chapter(string $bookSlug, string $chapterSlug) + { + /** @var Chapter $chapter */ + $chapter = Chapter::visible()->whereSlugs($bookSlug, $chapterSlug)->firstOrFail(); + $references = $this->referenceFetcher->getPageReferencesToEntity($chapter); + + return view('chapters.references', [ + 'chapter' => $chapter, + 'references' => $references, + ]); + } + + /** + * Display the references to a given book. + */ + public function book(string $slug) + { + $book = Book::visible()->where('slug', '=', $slug)->firstOrFail(); + $references = $this->referenceFetcher->getPageReferencesToEntity($book); + + return view('books.references', [ + 'book' => $book, + 'references' => $references, + ]); + } + + /** + * Display the references to a given shelf. + */ + public function shelf(string $slug) + { + $shelf = Bookshelf::visible()->where('slug', '=', $slug)->firstOrFail(); + $references = $this->referenceFetcher->getPageReferencesToEntity($shelf); + + return view('shelves.references', [ + 'shelf' => $shelf, 'references' => $references, ]); }