]> BookStack Code Mirror - bookstack/commitdiff
Started refactor to merge entity repos
authorDan Brown <redacted>
Sun, 1 Jan 2017 16:05:44 +0000 (16:05 +0000)
committerDan Brown <redacted>
Sun, 1 Jan 2017 16:05:44 +0000 (16:05 +0000)
14 files changed:
app/Chapter.php
app/Http/Controllers/AttachmentController.php
app/Http/Controllers/BookController.php
app/Http/Controllers/ChapterController.php
app/Http/Controllers/HomeController.php
app/Http/Controllers/PageController.php
app/Page.php
app/Repos/BookRepo.php
app/Repos/ChapterRepo.php
app/Repos/EntityRepo.php
app/Repos/PageRepo.php
app/Repos/UserRepo.php
app/Services/PermissionService.php
tests/Permissions/RestrictionsTest.php

index cc5518b7a831ea73a41681043a3deddeb214d946..586ce3fe37e6b97a1d3721c96c9aab9bdf903aeb 100644 (file)
@@ -5,6 +5,8 @@ class Chapter extends Entity
 {
     protected $fillable = ['name', 'description', 'priority', 'book_id'];
 
+    protected $with = ['book'];
+
     /**
      * Get the book this chapter is within.
      * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
index b5e7db41ee3aa89d76f37faee3eee3406c7dd056..715cd2bd8af66565c1c700fe8ffe458b8a0c85c3 100644 (file)
@@ -2,6 +2,7 @@
 
 use BookStack\Exceptions\FileUploadException;
 use BookStack\Attachment;
+use BookStack\Repos\EntityRepo;
 use BookStack\Repos\PageRepo;
 use BookStack\Services\AttachmentService;
 use Illuminate\Http\Request;
@@ -11,6 +12,7 @@ class AttachmentController extends Controller
     protected $attachmentService;
     protected $attachment;
     protected $pageRepo;
+    protected $entityRepo;
 
     /**
      * AttachmentController constructor.
@@ -18,11 +20,13 @@ class AttachmentController extends Controller
      * @param Attachment $attachment
      * @param PageRepo $pageRepo
      */
-    public function __construct(AttachmentService $attachmentService, Attachment $attachment, PageRepo $pageRepo)
+    public function __construct(AttachmentService $attachmentService, Attachment $attachment, EntityRepo $entityRepo, PageRepo $pageRepo)
     {
         $this->attachmentService = $attachmentService;
         $this->attachment = $attachment;
+        // TODO - Remove this
         $this->pageRepo = $pageRepo;
+        $this->entityRepo = $entityRepo;
         parent::__construct();
     }
 
@@ -40,7 +44,7 @@ class AttachmentController extends Controller
         ]);
 
         $pageId = $request->get('uploaded_to');
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
 
         $this->checkPermission('attachment-create-all');
         $this->checkOwnablePermission('page-update', $page);
@@ -70,7 +74,7 @@ class AttachmentController extends Controller
         ]);
 
         $pageId = $request->get('uploaded_to');
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
         $attachment = $this->attachment->findOrFail($attachmentId);
 
         $this->checkOwnablePermission('page-update', $page);
@@ -106,7 +110,7 @@ class AttachmentController extends Controller
         ]);
 
         $pageId = $request->get('uploaded_to');
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
         $attachment = $this->attachment->findOrFail($attachmentId);
 
         $this->checkOwnablePermission('page-update', $page);
@@ -134,7 +138,7 @@ class AttachmentController extends Controller
         ]);
 
         $pageId = $request->get('uploaded_to');
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
 
         $this->checkPermission('attachment-create-all');
         $this->checkOwnablePermission('page-update', $page);
@@ -153,7 +157,7 @@ class AttachmentController extends Controller
      */
     public function listForPage($pageId)
     {
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
         $this->checkOwnablePermission('page-view', $page);
         return response()->json($page->attachments);
     }
@@ -170,7 +174,7 @@ class AttachmentController extends Controller
             'files' => 'required|array',
             'files.*.id' => 'required|integer',
         ]);
-        $page = $this->pageRepo->getById($pageId);
+        $page = $this->entityRepo->getById('page', $pageId);
         $this->checkOwnablePermission('page-update', $page);
 
         $attachments = $request->get('files');
@@ -186,7 +190,7 @@ class AttachmentController extends Controller
     public function get($attachmentId)
     {
         $attachment = $this->attachment->findOrFail($attachmentId);
-        $page = $this->pageRepo->getById($attachment->uploaded_to);
+        $page = $this->entityRepo->getById('page', $attachment->uploaded_to);
         $this->checkOwnablePermission('page-view', $page);
 
         if ($attachment->external) {
index 80a6c24b3c40686e81b1a036fe636eb24ff8d8d9..0b4749a48fa73958b7c653ee0972cdc195a1a7c7 100644 (file)
@@ -1,6 +1,7 @@
 <?php namespace BookStack\Http\Controllers;
 
 use Activity;
+use BookStack\Repos\EntityRepo;
 use BookStack\Repos\UserRepo;
 use Illuminate\Http\Request;
 use BookStack\Http\Requests;
@@ -13,6 +14,7 @@ use Views;
 class BookController extends Controller
 {
 
+    protected $entityRepo;
     protected $bookRepo;
     protected $pageRepo;
     protected $chapterRepo;
@@ -25,8 +27,10 @@ class BookController extends Controller
      * @param ChapterRepo $chapterRepo
      * @param UserRepo $userRepo
      */
-    public function __construct(BookRepo $bookRepo, PageRepo $pageRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
+    public function __construct(EntityRepo $entityRepo, BookRepo $bookRepo, PageRepo $pageRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
     {
+        $this->entityRepo = $entityRepo;
+        // TODO - Remove below
         $this->bookRepo = $bookRepo;
         $this->pageRepo = $pageRepo;
         $this->chapterRepo = $chapterRepo;
@@ -40,9 +44,9 @@ class BookController extends Controller
      */
     public function index()
     {
-        $books = $this->bookRepo->getAllPaginated(10);
-        $recents = $this->signedIn ? $this->bookRepo->getRecentlyViewed(4, 0) : false;
-        $popular = $this->bookRepo->getPopular(4, 0);
+        $books = $this->entityRepo->getAllPaginated('book', 10);
+        $recents = $this->signedIn ? $this->entityRepo->getRecentlyViewed('book', 4, 0) : false;
+        $popular = $this->entityRepo->getPopular('book', 4, 0);
         $this->setPageTitle('Books');
         return view('books/index', ['books' => $books, 'recents' => $recents, 'popular' => $popular]);
     }
@@ -83,7 +87,7 @@ class BookController extends Controller
      */
     public function show($slug)
     {
-        $book = $this->bookRepo->getBySlug($slug);
+        $book = $this->entityRepo->getBySlug('book', $slug);
         $this->checkOwnablePermission('book-view', $book);
         $bookChildren = $this->bookRepo->getChildren($book);
         Views::add($book);
@@ -98,7 +102,7 @@ class BookController extends Controller
      */
     public function edit($slug)
     {
-        $book = $this->bookRepo->getBySlug($slug);
+        $book = $this->entityRepo->getBySlug('book', $slug);
         $this->checkOwnablePermission('book-update', $book);
         $this->setPageTitle(trans('entities.books_edit_named',['bookName'=>$book->getShortName()]));
         return view('books/edit', ['book' => $book, 'current' => $book]);
@@ -112,7 +116,7 @@ class BookController extends Controller
      */
     public function update(Request $request, $slug)
     {
-        $book = $this->bookRepo->getBySlug($slug);
+        $book = $this->entityRepo->getBySlug('book', $slug);
         $this->checkOwnablePermission('book-update', $book);
         $this->validate($request, [
             'name' => 'required|string|max:255',
@@ -130,7 +134,7 @@ class BookController extends Controller
      */
     public function showDelete($bookSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
         $this->checkOwnablePermission('book-delete', $book);
         $this->setPageTitle(trans('entities.books_delete_named', ['bookName'=>$book->getShortName()]));
         return view('books/delete', ['book' => $book, 'current' => $book]);
@@ -143,10 +147,10 @@ class BookController extends Controller
      */
     public function sort($bookSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
         $this->checkOwnablePermission('book-update', $book);
         $bookChildren = $this->bookRepo->getChildren($book, true);
-        $books = $this->bookRepo->getAll(false);
+        $books = $this->entityRepo->getAll('book', false);
         $this->setPageTitle(trans('entities.books_sort_named', ['bookName'=>$book->getShortName()]));
         return view('books/sort', ['book' => $book, 'current' => $book, 'books' => $books, 'bookChildren' => $bookChildren]);
     }
@@ -159,7 +163,7 @@ class BookController extends Controller
      */
     public function getSortItem($bookSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
         $bookChildren = $this->bookRepo->getChildren($book);
         return view('books/sort-box', ['book' => $book, 'bookChildren' => $bookChildren]);
     }
@@ -172,7 +176,7 @@ class BookController extends Controller
      */
     public function saveSort($bookSlug, Request $request)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
         $this->checkOwnablePermission('book-update', $book);
 
         // Return if no map sent
@@ -191,9 +195,9 @@ class BookController extends Controller
             $priority = $bookChild->sort;
             $id = intval($bookChild->id);
             $isPage = $bookChild->type == 'page';
-            $bookId = $this->bookRepo->exists($bookChild->book) ? intval($bookChild->book) : $defaultBookId;
+            $bookId = $this->entityRepo->exists('book', $bookChild->book) ? intval($bookChild->book) : $defaultBookId;
             $chapterId = ($isPage && $bookChild->parentChapter === false) ? 0 : intval($bookChild->parentChapter);
-            $model = $isPage ? $this->pageRepo->getById($id) : $this->chapterRepo->getById($id);
+            $model = $this->entityRepo->getById($isPage?'page':'chapter', $id);
 
             // Update models only if there's a change in parent chain or ordering.
             if ($model->priority !== $priority || $model->book_id !== $bookId || ($isPage && $model->chapter_id !== $chapterId)) {
@@ -212,7 +216,7 @@ class BookController extends Controller
 
         // Add activity for books
         foreach ($sortedBooks as $bookId) {
-            $updatedBook = $this->bookRepo->getById($bookId);
+            $updatedBook = $this->entityRepo->getById('book', $bookId);
             Activity::add($updatedBook, 'book_sort', $updatedBook->id);
         }
 
@@ -229,7 +233,7 @@ class BookController extends Controller
      */
     public function destroy($bookSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
         $this->checkOwnablePermission('book-delete', $book);
         Activity::addMessage('book_delete', 0, $book->name);
         Activity::removeEntity($book);
@@ -244,7 +248,7 @@ class BookController extends Controller
      */
     public function showRestrict($bookSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
         $this->checkOwnablePermission('restrictions-manage', $book);
         $roles = $this->userRepo->getRestrictableRoles();
         return view('books/restrictions', [
@@ -262,7 +266,7 @@ class BookController extends Controller
      */
     public function restrict($bookSlug, Request $request)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
         $this->checkOwnablePermission('restrictions-manage', $book);
         $this->bookRepo->updateEntityPermissionsFromRequest($request, $book);
         session()->flash('success', trans('entities.books_permissions_updated'));
index 84983518514d8342f9fbba4aeb63a7a34bd82887..e71ed4d98661064adb75a2f3a9a56986d71d3f14 100644 (file)
@@ -1,6 +1,7 @@
 <?php namespace BookStack\Http\Controllers;
 
 use Activity;
+use BookStack\Repos\EntityRepo;
 use BookStack\Repos\UserRepo;
 use Illuminate\Http\Request;
 use BookStack\Repos\BookRepo;
@@ -14,15 +15,19 @@ class ChapterController extends Controller
     protected $bookRepo;
     protected $chapterRepo;
     protected $userRepo;
+    protected $entityRepo;
 
     /**
      * ChapterController constructor.
+     * @param EntityRepo $entityRepo
      * @param BookRepo $bookRepo
      * @param ChapterRepo $chapterRepo
      * @param UserRepo $userRepo
      */
-    public function __construct(BookRepo $bookRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
+    public function __construct(EntityRepo $entityRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, UserRepo $userRepo)
     {
+        $this->entityRepo = $entityRepo;
+        // TODO - Remove below
         $this->bookRepo = $bookRepo;
         $this->chapterRepo = $chapterRepo;
         $this->userRepo = $userRepo;
@@ -36,7 +41,7 @@ class ChapterController extends Controller
      */
     public function create($bookSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
         $this->checkOwnablePermission('chapter-create', $book);
         $this->setPageTitle(trans('entities.chapters_create'));
         return view('chapters/create', ['book' => $book, 'current' => $book]);
@@ -54,7 +59,7 @@ class ChapterController extends Controller
             'name' => 'required|string|max:255'
         ]);
 
-        $book = $this->bookRepo->getBySlug($bookSlug);
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
         $this->checkOwnablePermission('chapter-create', $book);
 
         $input = $request->all();
@@ -72,15 +77,14 @@ class ChapterController extends Controller
      */
     public function show($bookSlug, $chapterSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+        $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
         $this->checkOwnablePermission('chapter-view', $chapter);
-        $sidebarTree = $this->bookRepo->getChildren($book);
+        $sidebarTree = $this->bookRepo->getChildren($chapter->book);
         Views::add($chapter);
         $this->setPageTitle($chapter->getShortName());
         $pages = $this->chapterRepo->getChildren($chapter);
         return view('chapters/show', [
-            'book' => $book,
+            'book' => $chapter->book,
             'chapter' => $chapter,
             'current' => $chapter,
             'sidebarTree' => $sidebarTree,
@@ -96,11 +100,10 @@ class ChapterController extends Controller
      */
     public function edit($bookSlug, $chapterSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+        $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
         $this->checkOwnablePermission('chapter-update', $chapter);
         $this->setPageTitle(trans('entities.chapters_edit_named', ['chapterName' => $chapter->getShortName()]));
-        return view('chapters/edit', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
+        return view('chapters/edit', ['book' => $chapter->book, 'chapter' => $chapter, 'current' => $chapter]);
     }
 
     /**
@@ -112,16 +115,15 @@ class ChapterController extends Controller
      */
     public function update(Request $request, $bookSlug, $chapterSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+        $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
         $this->checkOwnablePermission('chapter-update', $chapter);
         if ($chapter->name !== $request->get('name')) {
-            $chapter->slug = $this->chapterRepo->findSuitableSlug($request->get('name'), $book->id, $chapter->id);
+            $chapter->slug = $this->chapterRepo->findSuitableSlug($request->get('name'), $chapter->book->id, $chapter->id);
         }
         $chapter->fill($request->all());
         $chapter->updated_by = user()->id;
         $chapter->save();
-        Activity::add($chapter, 'chapter_update', $book->id);
+        Activity::add($chapter, 'chapter_update', $chapter->book->id);
         return redirect($chapter->getUrl());
     }
 
@@ -133,11 +135,10 @@ class ChapterController extends Controller
      */
     public function showDelete($bookSlug, $chapterSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+        $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
         $this->checkOwnablePermission('chapter-delete', $chapter);
         $this->setPageTitle(trans('entities.chapters_delete_named', ['chapterName' => $chapter->getShortName()]));
-        return view('chapters/delete', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
+        return view('chapters/delete', ['book' => $chapter->book, 'chapter' => $chapter, 'current' => $chapter]);
     }
 
     /**
@@ -148,8 +149,8 @@ class ChapterController extends Controller
      */
     public function destroy($bookSlug, $chapterSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+        $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
+        $book = $chapter->book;
         $this->checkOwnablePermission('chapter-delete', $chapter);
         Activity::addMessage('chapter_delete', $book->id, $chapter->name);
         $this->chapterRepo->destroy($chapter);
@@ -164,13 +165,12 @@ class ChapterController extends Controller
      * @throws \BookStack\Exceptions\NotFoundException
      */
     public function showMove($bookSlug, $chapterSlug) {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+        $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
         $this->setPageTitle(trans('entities.chapters_move_named', ['chapterName' => $chapter->getShortName()]));
         $this->checkOwnablePermission('chapter-update', $chapter);
         return view('chapters/move', [
             'chapter' => $chapter,
-            'book' => $book
+            'book' => $chapter->book
         ]);
     }
 
@@ -183,8 +183,7 @@ class ChapterController extends Controller
      * @throws \BookStack\Exceptions\NotFoundException
      */
     public function move($bookSlug, $chapterSlug, Request $request) {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+        $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
         $this->checkOwnablePermission('chapter-update', $chapter);
 
         $entitySelection = $request->get('entity_selection', null);
@@ -199,7 +198,7 @@ class ChapterController extends Controller
         $parent = false;
 
         if ($entityType == 'book') {
-            $parent = $this->bookRepo->getById($entityId);
+            $parent = $this->entityRepo->getById('book', $entityId);
         }
 
         if ($parent === false || $parent === null) {
@@ -222,8 +221,7 @@ class ChapterController extends Controller
      */
     public function showRestrict($bookSlug, $chapterSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+        $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
         $this->checkOwnablePermission('restrictions-manage', $chapter);
         $roles = $this->userRepo->getRestrictableRoles();
         return view('chapters/restrictions', [
@@ -241,8 +239,7 @@ class ChapterController extends Controller
      */
     public function restrict($bookSlug, $chapterSlug, Request $request)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
+        $chapter = $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug);
         $this->checkOwnablePermission('restrictions-manage', $chapter);
         $this->chapterRepo->updateEntityPermissionsFromRequest($request, $chapter);
         session()->flash('success', trans('entities.chapters_permissions_success'));
index e325b93229868c60bd7135068953f90b8603cd7d..f4706a5c4444316429decbd23cb63673a2e2bc78 100644 (file)
@@ -5,6 +5,7 @@ namespace BookStack\Http\Controllers;
 use Activity;
 use BookStack\Repos\EntityRepo;
 use BookStack\Http\Requests;
+use Illuminate\Http\Response;
 use Views;
 
 class HomeController extends Controller
@@ -31,9 +32,9 @@ class HomeController extends Controller
         $activity = Activity::latest(10);
         $draftPages = $this->signedIn ? $this->entityRepo->getUserDraftPages(6) : [];
         $recentFactor = count($draftPages) > 0 ? 0.5 : 1;
-        $recents = $this->signedIn ? Views::getUserRecentlyViewed(12*$recentFactor, 0) : $this->entityRepo->getRecentlyCreatedBooks(10*$recentFactor);
-        $recentlyCreatedPages = $this->entityRepo->getRecentlyCreatedPages(5);
-        $recentlyUpdatedPages = $this->entityRepo->getRecentlyUpdatedPages(5);
+        $recents = $this->signedIn ? Views::getUserRecentlyViewed(12*$recentFactor, 0) : $this->entityRepo->getRecentlyCreated('book', 10*$recentFactor);
+        $recentlyCreatedPages = $this->entityRepo->getRecentlyCreated('page', 5);
+        $recentlyUpdatedPages = $this->entityRepo->getRecentlyUpdated('page', 5);
         return view('home', [
             'activity' => $activity,
             'recents' => $recents,
index e40d7668a4fedd3fe46d747b3ab10e0830274a6f..0d6678e048d422e47acafcbabf7b52bd3e0d4c0c 100644 (file)
@@ -2,22 +2,22 @@
 
 use Activity;
 use BookStack\Exceptions\NotFoundException;
+use BookStack\Repos\EntityRepo;
 use BookStack\Repos\UserRepo;
 use BookStack\Services\ExportService;
 use Carbon\Carbon;
 use Illuminate\Http\Request;
-use BookStack\Http\Requests;
 use BookStack\Repos\BookRepo;
 use BookStack\Repos\ChapterRepo;
 use BookStack\Repos\PageRepo;
 use Illuminate\Http\Response;
-use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Views;
 use GatherContent\Htmldiff\Htmldiff;
 
 class PageController extends Controller
 {
 
+    protected $entityRepo;
     protected $pageRepo;
     protected $bookRepo;
     protected $chapterRepo;
@@ -32,8 +32,10 @@ class PageController extends Controller
      * @param ExportService $exportService
      * @param UserRepo $userRepo
      */
-    public function __construct(PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, ExportService $exportService, UserRepo $userRepo)
+    public function __construct(EntityRepo $entityRepo, PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, ExportService $exportService, UserRepo $userRepo)
     {
+        $this->entityRepo = $entityRepo;
+        // TODO - remove below;
         $this->pageRepo = $pageRepo;
         $this->bookRepo = $bookRepo;
         $this->chapterRepo = $chapterRepo;
@@ -51,8 +53,8 @@ class PageController extends Controller
      */
     public function create($bookSlug, $chapterSlug = null)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : null;
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
+        $chapter = $chapterSlug ? $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug) : null;
         $parent = $chapter ? $chapter : $book;
         $this->checkOwnablePermission('page-create', $parent);
 
@@ -81,8 +83,8 @@ class PageController extends Controller
             'name' => 'required|string|max:255'
         ]);
 
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : null;
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
+        $chapter = $chapterSlug ? $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug) : null;
         $parent = $chapter ? $chapter : $book;
         $this->checkOwnablePermission('page-create', $parent);
 
@@ -102,15 +104,14 @@ class PageController extends Controller
      */
     public function editDraft($bookSlug, $pageId)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $draft = $this->pageRepo->getById($pageId, true);
-        $this->checkOwnablePermission('page-create', $book);
+        $draft = $this->entityRepo->getById('page', $pageId, true);
+        $this->checkOwnablePermission('page-create', $draft->book);
         $this->setPageTitle(trans('entities.pages_edit_draft'));
 
         $draftsEnabled = $this->signedIn;
         return view('pages/edit', [
             'page' => $draft,
-            'book' => $book,
+            'book' => $draft->book,
             'isDraft' => true,
             'draftsEnabled' => $draftsEnabled
         ]);
@@ -130,12 +131,12 @@ class PageController extends Controller
         ]);
 
         $input = $request->all();
-        $book = $this->bookRepo->getBySlug($bookSlug);
+        $book = $this->entityRepo->getBySlug('book', $bookSlug);
 
-        $draftPage = $this->pageRepo->getById($pageId, true);
+        $draftPage = $this->entityRepo->getById('page', $pageId, true);
 
         $chapterId = intval($draftPage->chapter_id);
-        $parent = $chapterId !== 0 ? $this->chapterRepo->getById($chapterId) : $book;
+        $parent = $chapterId !== 0 ? $this->entityRepo->getById('chapter', $chapterId) : $book;
         $this->checkOwnablePermission('page-create', $parent);
 
         if ($parent->isA('chapter')) {
@@ -152,18 +153,15 @@ class PageController extends Controller
 
     /**
      * Display the specified page.
-     * If the page is not found via the slug the
-     * revisions are searched for a match.
+     * If the page is not found via the slug the revisions are searched for a match.
      * @param string $bookSlug
      * @param string $pageSlug
      * @return Response
      */
     public function show($bookSlug, $pageSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-
         try {
-            $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+            $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         } catch (NotFoundException $e) {
             $page = $this->pageRepo->findPageUsingOldSlug($pageSlug, $bookSlug);
             if ($page === null) abort(404);
@@ -172,12 +170,12 @@ class PageController extends Controller
 
         $this->checkOwnablePermission('page-view', $page);
 
-        $sidebarTree = $this->bookRepo->getChildren($book);
+        $sidebarTree = $this->bookRepo->getChildren($page->book);
         $pageNav = $this->pageRepo->getPageNav($page);
         
         Views::add($page);
         $this->setPageTitle($page->getShortName());
-        return view('pages/show', ['page' => $page, 'book' => $book,
+        return view('pages/show', ['page' => $page, 'book' => $page->book,
                                    'current' => $page, 'sidebarTree' => $sidebarTree, 'pageNav' => $pageNav]);
     }
 
@@ -188,7 +186,7 @@ class PageController extends Controller
      */
     public function getPageAjax($pageId)
     {
-        $page = $this->pageRepo->getById($pageId);
+        $page = $this->entityRepo->getById('page', $pageId);
         return response()->json($page);
     }
 
@@ -200,8 +198,7 @@ class PageController extends Controller
      */
     public function edit($bookSlug, $pageSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $this->checkOwnablePermission('page-update', $page);
         $this->setPageTitle(trans('entities.pages_editing_named', ['pageName'=>$page->getShortName()]));
         $page->isDraft = false;
@@ -227,7 +224,7 @@ class PageController extends Controller
         $draftsEnabled = $this->signedIn;
         return view('pages/edit', [
             'page' => $page,
-            'book' => $book,
+            'book' => $page->book,
             'current' => $page,
             'draftsEnabled' => $draftsEnabled
         ]);
@@ -245,11 +242,10 @@ class PageController extends Controller
         $this->validate($request, [
             'name' => 'required|string|max:255'
         ]);
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $this->checkOwnablePermission('page-update', $page);
-        $this->pageRepo->updatePage($page, $book->id, $request->all());
-        Activity::add($page, 'page_update', $book->id);
+        $this->pageRepo->updatePage($page, $page->book->id, $request->all());
+        Activity::add($page, 'page_update', $page->book->id);
         return redirect($page->getUrl());
     }
 
@@ -261,7 +257,7 @@ class PageController extends Controller
      */
     public function saveDraft(Request $request, $pageId)
     {
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
         $this->checkOwnablePermission('page-update', $page);
 
         if (!$this->signedIn) {
@@ -294,7 +290,7 @@ class PageController extends Controller
      */
     public function redirectFromLink($pageId)
     {
-        $page = $this->pageRepo->getById($pageId);
+        $page = $this->entityRepo->getById('page', $pageId);
         return redirect($page->getUrl());
     }
 
@@ -306,11 +302,10 @@ class PageController extends Controller
      */
     public function showDelete($bookSlug, $pageSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $this->checkOwnablePermission('page-delete', $page);
         $this->setPageTitle(trans('entities.pages_delete_named', ['pageName'=>$page->getShortName()]));
-        return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
+        return view('pages/delete', ['book' => $page->book, 'page' => $page, 'current' => $page]);
     }
 
 
@@ -323,11 +318,10 @@ class PageController extends Controller
      */
     public function showDeleteDraft($bookSlug, $pageId)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
         $this->checkOwnablePermission('page-update', $page);
         $this->setPageTitle(trans('entities.pages_delete_draft_named', ['pageName'=>$page->getShortName()]));
-        return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
+        return view('pages/delete', ['book' => $page->book, 'page' => $page, 'current' => $page]);
     }
 
     /**
@@ -339,8 +333,8 @@ class PageController extends Controller
      */
     public function destroy($bookSlug, $pageSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
+        $book = $page->book;
         $this->checkOwnablePermission('page-delete', $page);
         Activity::addMessage('page_delete', $book->id, $page->name);
         session()->flash('success', trans('entities.pages_delete_success'));
@@ -357,8 +351,8 @@ class PageController extends Controller
      */
     public function destroyDraft($bookSlug, $pageId)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getById($pageId, true);
+        $page = $this->entityRepo->getById('page', $pageId, true);
+        $book = $page->book;
         $this->checkOwnablePermission('page-update', $page);
         session()->flash('success', trans('entities.pages_delete_draft_success'));
         $this->pageRepo->destroy($page);
@@ -373,10 +367,9 @@ class PageController extends Controller
      */
     public function showRevisions($bookSlug, $pageSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $this->setPageTitle(trans('entities.pages_revisions_named', ['pageName'=>$page->getShortName()]));
-        return view('pages/revisions', ['page' => $page, 'book' => $book, 'current' => $page]);
+        return view('pages/revisions', ['page' => $page, 'book' => $page->book, 'current' => $page]);
     }
 
     /**
@@ -388,8 +381,7 @@ class PageController extends Controller
      */
     public function showRevision($bookSlug, $pageSlug, $revisionId)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $revision = $this->pageRepo->getRevisionById($revisionId);
 
         $page->fill($revision->toArray());
@@ -397,7 +389,7 @@ class PageController extends Controller
         
         return view('pages/revision', [
             'page' => $page,
-            'book' => $book,
+            'book' => $page->book,
         ]);
     }
 
@@ -410,8 +402,7 @@ class PageController extends Controller
      */
     public function showRevisionChanges($bookSlug, $pageSlug, $revisionId)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $revision = $this->pageRepo->getRevisionById($revisionId);
 
         $prev = $revision->getPrevious();
@@ -423,7 +414,7 @@ class PageController extends Controller
 
         return view('pages/revision', [
             'page' => $page,
-            'book' => $book,
+            'book' => $page->book,
             'diff' => $diff,
         ]);
     }
@@ -437,11 +428,10 @@ class PageController extends Controller
      */
     public function restoreRevision($bookSlug, $pageSlug, $revisionId)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $this->checkOwnablePermission('page-update', $page);
-        $page = $this->pageRepo->restoreRevision($page, $book, $revisionId);
-        Activity::add($page, 'page_restore', $book->id);
+        $page = $this->pageRepo->restoreRevision($page, $page->book, $revisionId);
+        Activity::add($page, 'page_restore', $page->book->id);
         return redirect($page->getUrl());
     }
 
@@ -454,8 +444,7 @@ class PageController extends Controller
      */
     public function exportPdf($bookSlug, $pageSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $pdfContent = $this->exportService->pageToPdf($page);
         return response()->make($pdfContent, 200, [
             'Content-Type'        => 'application/octet-stream',
@@ -471,8 +460,7 @@ class PageController extends Controller
      */
     public function exportHtml($bookSlug, $pageSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $containedHtml = $this->exportService->pageToContainedHtml($page);
         return response()->make($containedHtml, 200, [
             'Content-Type'        => 'application/octet-stream',
@@ -488,8 +476,7 @@ class PageController extends Controller
      */
     public function exportPlainText($bookSlug, $pageSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $containedHtml = $this->exportService->pageToPlainText($page);
         return response()->make($containedHtml, 200, [
             'Content-Type'        => 'application/octet-stream',
@@ -531,8 +518,7 @@ class PageController extends Controller
      */
     public function showRestrict($bookSlug, $pageSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $this->checkOwnablePermission('restrictions-manage', $page);
         $roles = $this->userRepo->getRestrictableRoles();
         return view('pages/restrictions', [
@@ -550,11 +536,10 @@ class PageController extends Controller
      */
     public function showMove($bookSlug, $pageSlug)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $this->checkOwnablePermission('page-update', $page);
         return view('pages/move', [
-            'book' => $book,
+            'book' => $page->book,
             'page' => $page
         ]);
     }
@@ -569,8 +554,7 @@ class PageController extends Controller
      */
     public function move($bookSlug, $pageSlug, Request $request)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $this->checkOwnablePermission('page-update', $page);
 
         $entitySelection = $request->get('entity_selection', null);
@@ -582,15 +566,10 @@ class PageController extends Controller
         $entityType = $stringExploded[0];
         $entityId = intval($stringExploded[1]);
 
-        $parent = false;
-
-        if ($entityType == 'chapter') {
-            $parent = $this->chapterRepo->getById($entityId);
-        } else if ($entityType == 'book') {
-            $parent = $this->bookRepo->getById($entityId);
-        }
 
-        if ($parent === false || $parent === null) {
+        try {
+            $parent = $this->entityRepo->getById($entityType, $entityId);
+        } catch (\Exception $e) {
             session()->flash(trans('entities.selected_book_chapter_not_found'));
             return redirect()->back();
         }
@@ -611,8 +590,7 @@ class PageController extends Controller
      */
     public function restrict($bookSlug, $pageSlug, Request $request)
     {
-        $book = $this->bookRepo->getBySlug($bookSlug);
-        $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
+        $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug);
         $this->checkOwnablePermission('restrictions-manage', $page);
         $this->pageRepo->updateEntityPermissionsFromRequest($request, $page);
         session()->flash('success', trans('entities.pages_permissions_success'));
index 3ee9e90f43d7d110699076b7ca0502822d00241d..38f95a3b1d8d703c110932ba147936bbdc1e8c33 100644 (file)
@@ -7,6 +7,8 @@ class Page extends Entity
 
     protected $simpleAttributes = ['name', 'id', 'slug'];
 
+    protected $with = ['book'];
+
     /**
      * Converts this page into a simplified array.
      * @return mixed
index b14cf0dabc205e24979e911b69df89fc9a000f88..ebfda3fa44dd0829455c34d66ab31cb60e2434f6 100644 (file)
@@ -1,11 +1,6 @@
 <?php namespace BookStack\Repos;
 
-use Alpha\B;
-use BookStack\Exceptions\NotFoundException;
-use Illuminate\Database\Eloquent\Collection;
-use Illuminate\Support\Str;
 use BookStack\Book;
-use Views;
 
 class BookRepo extends EntityRepo
 {
@@ -24,105 +19,6 @@ class BookRepo extends EntityRepo
         parent::__construct();
     }
 
-    /**
-     * Base query for getting books.
-     * Takes into account any restrictions.
-     * @return mixed
-     */
-    private function bookQuery()
-    {
-        return $this->permissionService->enforceBookRestrictions($this->book, 'view');
-    }
-
-    /**
-     * Get the book that has the given id.
-     * @param $id
-     * @return mixed
-     */
-    public function getById($id)
-    {
-        return $this->bookQuery()->findOrFail($id);
-    }
-
-    /**
-     * Get all books, Limited by count.
-     * @param int $count
-     * @return mixed
-     */
-    public function getAll($count = 10)
-    {
-        $bookQuery = $this->bookQuery()->orderBy('name', 'asc');
-        if (!$count) return $bookQuery->get();
-        return $bookQuery->take($count)->get();
-    }
-
-    /**
-     * Get all books paginated.
-     * @param int $count
-     * @return mixed
-     */
-    public function getAllPaginated($count = 10)
-    {
-        return $this->bookQuery()
-            ->orderBy('name', 'asc')->paginate($count);
-    }
-
-
-    /**
-     * Get the latest books.
-     * @param int $count
-     * @return mixed
-     */
-    public function getLatest($count = 10)
-    {
-        return $this->bookQuery()->orderBy('created_at', 'desc')->take($count)->get();
-    }
-
-    /**
-     * Gets the most recently viewed for a user.
-     * @param int $count
-     * @param int $page
-     * @return mixed
-     */
-    public function getRecentlyViewed($count = 10, $page = 0)
-    {
-        return Views::getUserRecentlyViewed($count, $page, $this->book);
-    }
-
-    /**
-     * Gets the most viewed books.
-     * @param int $count
-     * @param int $page
-     * @return mixed
-     */
-    public function getPopular($count = 10, $page = 0)
-    {
-        return Views::getPopular($count, $page, $this->book);
-    }
-
-    /**
-     * Get a book by slug
-     * @param $slug
-     * @return mixed
-     * @throws NotFoundException
-     */
-    public function getBySlug($slug)
-    {
-        $book = $this->bookQuery()->where('slug', '=', $slug)->first();
-        if ($book === null) throw new NotFoundException(trans('errors.book_not_found'));
-        return $book;
-    }
-
-    /**
-     * Checks if a book exists.
-     * @param $id
-     * @return bool
-     */
-    public function exists($id)
-    {
-        return $this->bookQuery()->where('id', '=', $id)->exists();
-    }
-
     /**
      * Get a new book instance from request input.
      * @param array $input
index 4106f93ee32e27ee7f3bfde0b759b11c02014a08..861bb72fcc6f6b50731177ebd2de09a326f6661a 100644 (file)
@@ -21,58 +21,6 @@ class ChapterRepo extends EntityRepo
         parent::__construct();
     }
 
-    /**
-     * Base query for getting chapters, Takes permissions into account.
-     * @return mixed
-     */
-    private function chapterQuery()
-    {
-        return $this->permissionService->enforceChapterRestrictions($this->chapter, 'view');
-    }
-
-    /**
-     * Check if an id exists.
-     * @param $id
-     * @return bool
-     */
-    public function idExists($id)
-    {
-        return $this->chapterQuery()->where('id', '=', $id)->count() > 0;
-    }
-
-    /**
-     * Get a chapter by a specific id.
-     * @param $id
-     * @return mixed
-     */
-    public function getById($id)
-    {
-        return $this->chapterQuery()->findOrFail($id);
-    }
-
-    /**
-     * Get all chapters.
-     * @return \Illuminate\Database\Eloquent\Collection|static[]
-     */
-    public function getAll()
-    {
-        return $this->chapterQuery()->all();
-    }
-
-    /**
-     * Get a chapter that has the given slug within the given book.
-     * @param $slug
-     * @param $bookId
-     * @return mixed
-     * @throws NotFoundException
-     */
-    public function getBySlug($slug, $bookId)
-    {
-        $chapter = $this->chapterQuery()->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
-        if ($chapter === null) throw new NotFoundException(trans('errors.chapter_not_found'));
-        return $chapter;
-    }
-
     /**
      * Get the child items for a chapter
      * @param Chapter $chapter
index 7ecfb758c9e31364414987cc1121fa1df18f377d..19beebc77f829d85b2ea6f723f413e65298b50ea 100644 (file)
@@ -3,11 +3,12 @@
 use BookStack\Book;
 use BookStack\Chapter;
 use BookStack\Entity;
+use BookStack\Exceptions\NotFoundException;
 use BookStack\Page;
 use BookStack\Services\PermissionService;
-use BookStack\User;
+use BookStack\Services\ViewService;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Collection;
-use Illuminate\Support\Facades\Log;
 
 class EntityRepo
 {
@@ -27,11 +28,22 @@ class EntityRepo
      */
     public $page;
 
+    /**
+     * Base entity instances keyed by type
+     * @var []Entity
+     */
+    protected $entities;
+
     /**
      * @var PermissionService
      */
     protected $permissionService;
 
+    /**
+     * @var ViewService
+     */
+    protected $viewService;
+
     /**
      * Acceptable operators to be used in a query
      * @var array
@@ -43,69 +55,144 @@ class EntityRepo
      */
     public function __construct()
     {
+        // TODO - Redo this to come via injection
         $this->book = app(Book::class);
         $this->chapter = app(Chapter::class);
         $this->page = app(Page::class);
+        $this->entities = [
+            'page' => $this->page,
+            'chapter' => $this->chapter,
+            'book' => $this->book
+        ];
+        $this->viewService = app(ViewService::class);
         $this->permissionService = app(PermissionService::class);
     }
 
     /**
-     * Get the latest books added to the system.
-     * @param int $count
-     * @param int $page
-     * @param bool $additionalQuery
-     * @return
+     * Get an entity instance via type.
+     * @param $type
+     * @return Entity
      */
-    public function getRecentlyCreatedBooks($count = 20, $page = 0, $additionalQuery = false)
+    protected function getEntity($type)
     {
-        $query = $this->permissionService->enforceBookRestrictions($this->book)
-            ->orderBy('created_at', 'desc');
-        if ($additionalQuery !== false && is_callable($additionalQuery)) {
-            $additionalQuery($query);
+        return $this->entities[strtolower($type)];
+    }
+
+    /**
+     * Base query for searching entities via permission system
+     * @param string $type
+     * @param bool $allowDrafts
+     * @return \Illuminate\Database\Query\Builder
+     */
+    protected function entityQuery($type, $allowDrafts = false)
+    {
+        $q = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type), 'view');
+        if (strtolower($type) === 'page' && !$allowDrafts) {
+            $q = $q->where('draft', '=', false);
         }
-        return $query->skip($page * $count)->take($count)->get();
+        return $q;
     }
 
     /**
-     * Get the most recently updated books.
-     * @param $count
-     * @param int $page
-     * @return mixed
+     * Check if an entity with the given id exists.
+     * @param $type
+     * @param $id
+     * @return bool
      */
-    public function getRecentlyUpdatedBooks($count = 20, $page = 0)
+    public function exists($type, $id)
     {
-        return $this->permissionService->enforceBookRestrictions($this->book)
-            ->orderBy('updated_at', 'desc')->skip($page * $count)->take($count)->get();
+        return $this->entityQuery($type)->where('id', '=', $id)->exists();
     }
 
     /**
-     * Get the latest pages added to the system.
+     * Get an entity by ID
+     * @param string $type
+     * @param integer $id
+     * @param bool $allowDrafts
+     * @return Entity
+     */
+    public function getById($type, $id, $allowDrafts = false)
+    {
+        return $this->entityQuery($type, $allowDrafts)->findOrFail($id);
+    }
+
+    /**
+     * Get an entity by its url slug.
+     * @param string $type
+     * @param string $slug
+     * @param string|bool $bookSlug
+     * @return Entity
+     * @throws NotFoundException
+     */
+    public function getBySlug($type, $slug, $bookSlug = false)
+    {
+        $q = $this->entityQuery($type)->where('slug', '=', $slug);
+        if (strtolower($type) === 'chapter' || strtolower($type) === 'page') {
+            $q = $q->where('book_id', '=', function($query) use ($bookSlug) {
+                $query->select('id')
+                    ->from($this->book->getTable())
+                    ->where('slug', '=', $bookSlug)->limit(1);
+            });
+        }
+        $entity = $q->first();
+        if ($entity === null) throw new NotFoundException(trans('errors.' . strtolower($type) . '_not_found'));
+        return $entity;
+    }
+
+    /**
+     * Get all entities of a type limited by count unless count if false.
+     * @param string $type
+     * @param integer|bool $count
+     * @return Collection
+     */
+    public function getAll($type, $count = 20)
+    {
+        $q = $this->entityQuery($type)->orderBy('name', 'asc');
+        if ($count !== false) $q = $q->take($count);
+        return $q->get();
+    }
+
+    /**
+     * Get all entities in a paginated format
+     * @param $type
+     * @param int $count
+     * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
+     */
+    public function getAllPaginated($type, $count = 10)
+    {
+        return $this->entityQuery($type)->orderBy('name', 'asc')->paginate($count);
+    }
+
+    /**
+     * Get the most recently created entities of the given type.
+     * @param string $type
      * @param int $count
      * @param int $page
-     * @param bool $additionalQuery
-     * @return
+     * @param bool|callable $additionalQuery
      */
-    public function getRecentlyCreatedPages($count = 20, $page = 0, $additionalQuery = false)
+    public function getRecentlyCreated($type, $count = 20, $page = 0, $additionalQuery = false)
     {
-        $query = $this->permissionService->enforcePageRestrictions($this->page)
-            ->orderBy('created_at', 'desc')->where('draft', '=', false);
+        $query = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type))
+            ->orderBy('created_at', 'desc');
+        if (strtolower($type) === 'page') $query = $query->where('draft', '=', false);
         if ($additionalQuery !== false && is_callable($additionalQuery)) {
             $additionalQuery($query);
         }
-        return $query->with('book')->skip($page * $count)->take($count)->get();
+        return $query->skip($page * $count)->take($count)->get();
     }
 
     /**
-     * Get the latest chapters added to the system.
+     * Get the most recently updated entities of the given type.
+     * @param string $type
      * @param int $count
      * @param int $page
-     * @param bool $additionalQuery
-     * @return
+     * @param bool|callable $additionalQuery
      */
-    public function getRecentlyCreatedChapters($count = 20, $page = 0, $additionalQuery = false)
+    public function getRecentlyUpdated($type, $count = 20, $page = 0, $additionalQuery = false)
     {
-        $query = $this->permissionService->enforceChapterRestrictions($this->chapter)
-            ->orderBy('created_at', 'desc');
+        $query = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type))
+            ->orderBy('updated_at', 'desc');
+        if (strtolower($type) === 'page') $query = $query->where('draft', '=', false);
         if ($additionalQuery !== false && is_callable($additionalQuery)) {
             $additionalQuery($query);
         }
@@ -113,16 +200,29 @@ class EntityRepo
     }
 
     /**
-     * Get the most recently updated pages.
-     * @param $count
+     * Get the most recently viewed entities.
+     * @param string|bool $type
+     * @param int $count
+     * @param int $page
+     * @return mixed
+     */
+    public function getRecentlyViewed($type, $count = 10, $page = 0)
+    {
+        $filter = is_bool($type) ? false : $this->getEntity($type);
+        return $this->viewService->getUserRecentlyViewed($count, $page, $filter);
+    }
+
+    /**
+     * Get the most popular entities base on all views.
+     * @param string|bool $type
+     * @param int $count
      * @param int $page
      * @return mixed
      */
-    public function getRecentlyUpdatedPages($count = 20, $page = 0)
+    public function getPopular($type, $count = 10, $page = 0)
     {
-        return $this->permissionService->enforcePageRestrictions($this->page)
-            ->where('draft', '=', false)
-            ->orderBy('updated_at', 'desc')->with('book')->skip($page * $count)->take($count)->get();
+        $filter = is_bool($type) ? false : $this->getEntity($type);
+        return $this->viewService->getPopular($count, $page, $filter);
     }
 
     /**
index 14463c12d191c8473ac26e7938ee0420c605cc21..f16ea6b6d5ff69c67771ac93cd4c804f869c6b5a 100644 (file)
@@ -45,31 +45,6 @@ class PageRepo extends EntityRepo
         return $query;
     }
 
-    /**
-     * Get a page via a specific ID.
-     * @param $id
-     * @param bool $allowDrafts
-     * @return Page
-     */
-    public function getById($id, $allowDrafts = false)
-    {
-        return $this->pageQuery($allowDrafts)->findOrFail($id);
-    }
-
-    /**
-     * Get a page identified by the given slug.
-     * @param $slug
-     * @param $bookId
-     * @return Page
-     * @throws NotFoundException
-     */
-    public function getBySlug($slug, $bookId)
-    {
-        $page = $this->pageQuery()->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first();
-        if ($page === null) throw new NotFoundException(trans('errors.page_not_found'));
-        return $page;
-    }
-
     /**
      * Search through page revisions and retrieve
      * the last page in the current book that
index 22c92f3cea1b8e16f18244eb417be8b040deeaf3..c3546a442cc27dc8fecfc54d04ec66f0b16ceac9 100644 (file)
@@ -168,13 +168,13 @@ class UserRepo
     public function getRecentlyCreated(User $user, $count = 20)
     {
         return [
-            'pages'    => $this->entityRepo->getRecentlyCreatedPages($count, 0, function ($query) use ($user) {
+            'pages'    => $this->entityRepo->getRecentlyCreated('page', $count, 0, function ($query) use ($user) {
                 $query->where('created_by', '=', $user->id);
             }),
-            'chapters' => $this->entityRepo->getRecentlyCreatedChapters($count, 0, function ($query) use ($user) {
+            'chapters' => $this->entityRepo->getRecentlyCreated('chapter', $count, 0, function ($query) use ($user) {
                 $query->where('created_by', '=', $user->id);
             }),
-            'books'    => $this->entityRepo->getRecentlyCreatedBooks($count, 0, function ($query) use ($user) {
+            'books'    => $this->entityRepo->getRecentlyCreated('book', $count, 0, function ($query) use ($user) {
                 $query->where('created_by', '=', $user->id);
             })
         ];
index bb78f0b0a2c7481cdd9be119d6d2436eb6e16c90..d5044c1bbdde580d3a65c3ae0e6d0b2f9dc27b0d 100644 (file)
@@ -8,8 +8,8 @@ use BookStack\Ownable;
 use BookStack\Page;
 use BookStack\Role;
 use BookStack\User;
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Support\Collection;
-use Illuminate\Support\Facades\Log;
 
 class PermissionService
 {
@@ -469,17 +469,8 @@ class PermissionService
      */
     public function enforcePageRestrictions($query, $action = 'view')
     {
-        // Prevent drafts being visible to others.
-        $query = $query->where(function ($query) {
-            $query->where('draft', '=', false);
-            if ($this->currentUser()) {
-                $query->orWhere(function ($query) {
-                    $query->where('draft', '=', true)->where('created_by', '=', $this->currentUser()->id);
-                });
-            }
-        });
-
-        return $this->enforceEntityRestrictions($query, $action);
+        // TODO - remove this
+        return $this->enforceEntityRestrictions('page', $query, $action);
     }
 
     /**
@@ -490,7 +481,8 @@ class PermissionService
      */
     public function enforceChapterRestrictions($query, $action = 'view')
     {
-        return $this->enforceEntityRestrictions($query, $action);
+        // TODO - remove this
+        return $this->enforceEntityRestrictions('chapter', $query, $action);
     }
 
     /**
@@ -501,21 +493,36 @@ class PermissionService
      */
     public function enforceBookRestrictions($query, $action = 'view')
     {
-        return $this->enforceEntityRestrictions($query, $action);
+        // TODO - remove this
+        return $this->enforceEntityRestrictions('book', $query, $action);
     }
 
     /**
      * Add restrictions for a generic entity
-     * @param $query
+     * @param string $entityType
+     * @param Builder|Entity $query
      * @param string $action
      * @return mixed
      */
-    public function enforceEntityRestrictions($query, $action = 'view')
+    public function enforceEntityRestrictions($entityType, $query, $action = 'view')
     {
+        if (strtolower($entityType) === 'page') {
+            // Prevent drafts being visible to others.
+            $query = $query->where(function ($query) {
+                $query->where('draft', '=', false);
+                if ($this->currentUser()) {
+                    $query->orWhere(function ($query) {
+                        $query->where('draft', '=', true)->where('created_by', '=', $this->currentUser()->id);
+                    });
+                }
+            });
+        }
+
         if ($this->isAdmin()) {
             $this->clean();
             return $query;
         }
+
         $this->currentAction = $action;
         return $this->entityRestrictionQuery($query);
     }
index d3830cff773da95d36550fa927981e2679a62bfb..cddd3206a36921abe7b1bb4f9c7940c505d81d4e 100644 (file)
@@ -65,9 +65,9 @@ class RestrictionsTest extends TestCase
         $this->forceVisit($bookUrl)
             ->see('Book not found');
         $this->forceVisit($bookPage->getUrl())
-            ->see('Book not found');
+            ->see('Page not found');
         $this->forceVisit($bookChapter->getUrl())
-            ->see('Book not found');
+            ->see('Chapter not found');
 
         $this->setEntityRestrictions($book, ['view']);
 
Morty Proxy This is a proxified and sanitized view of the page, visit original site.