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;
}
/**
*/
public function page(string $bookSlug, string $pageSlug)
{
- /** @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();
+ $page = Page::getBySlugs($bookSlug, $pageSlug);
+ $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)
+ {
+ $chapter = Chapter::getBySlugs($bookSlug, $chapterSlug);
+ $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::getBySlug($slug);
+ $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::getBySlug($slug);
+ $references = $this->referenceFetcher->getPageReferencesToEntity($shelf);
+
+ return view('shelves.references', [
+ 'shelf' => $shelf,
'references' => $references,
]);
}