]> BookStack Code Mirror - bookstack/commitdiff
Updated various classes to take EntityProvider instead of separate entities
authorDan Brown <redacted>
Tue, 25 Sep 2018 17:00:40 +0000 (18:00 +0100)
committerDan Brown <redacted>
Tue, 25 Sep 2018 17:00:40 +0000 (18:00 +0100)
app/Auth/Permissions/PermissionService.php
app/Auth/UserRepo.php
app/Entities/Entity.php
app/Entities/EntityProvider.php
app/Entities/EntityRepo.php
app/Entities/SearchService.php
app/Http/Controllers/BookController.php
app/Uploads/Attachment.php
app/Uploads/ImageRepo.php

index a4b9103babe53dd574d5995a6e136b6e7711d121..d0e6ccceab56640ddbee6b48a5b99b4cf14f815f 100644 (file)
@@ -6,6 +6,7 @@ use BookStack\Entities\Book;
 use BookStack\Entities\Bookshelf;
 use BookStack\Entities\Chapter;
 use BookStack\Entities\Entity;
+use BookStack\Entities\EntityProvider;
 use BookStack\Entities\Page;
 use BookStack\Ownable;
 use Illuminate\Database\Connection;
@@ -21,17 +22,31 @@ class PermissionService
     protected $userRoles = false;
     protected $currentUserModel = false;
 
-    public $book;
-    public $chapter;
-    public $page;
-    public $bookshelf;
-
+    /**
+     * @var Connection
+     */
     protected $db;
 
+    /**
+     * @var JointPermission
+     */
     protected $jointPermission;
+
+    /**
+     * @var Role
+     */
     protected $role;
+
+    /**
+     * @var EntityPermission
+     */
     protected $entityPermission;
 
+    /**
+     * @var EntityProvider
+     */
+    protected $entityProvider;
+
     protected $entityCache;
 
     /**
@@ -40,29 +55,20 @@ class PermissionService
      * @param EntityPermission $entityPermission
      * @param Role $role
      * @param Connection $db
-     * @param Bookshelf $bookshelf
-     * @param Book $book
-     * @param \BookStack\Entities\Chapter $chapter
-     * @param \BookStack\Entities\Page $page
+     * @param EntityProvider $entityProvider
      */
     public function __construct(
         JointPermission $jointPermission,
         Permissions\EntityPermission $entityPermission,
         Role $role,
         Connection $db,
-        Bookshelf $bookshelf,
-        Book $book,
-        Chapter $chapter,
-        Page $page
+        EntityProvider $entityProvider
     ) {
         $this->db = $db;
         $this->jointPermission = $jointPermission;
         $this->entityPermission = $entityPermission;
         $this->role = $role;
-        $this->bookshelf = $bookshelf;
-        $this->book = $book;
-        $this->chapter = $chapter;
-        $this->page = $page;
+        $this->entityProvider = $entityProvider;
     }
 
     /**
@@ -102,7 +108,7 @@ class PermissionService
             return $this->entityCache['book']->get($bookId);
         }
 
-        $book = $this->book->find($bookId);
+        $book = $this->entityProvider->book->find($bookId);
         if ($book === null) {
             $book = false;
         }
@@ -121,7 +127,7 @@ class PermissionService
             return $this->entityCache['chapter']->get($chapterId);
         }
 
-        $chapter = $this->chapter->find($chapterId);
+        $chapter = $this->entityProvider->chapter->find($chapterId);
         if ($chapter === null) {
             $chapter = false;
         }
@@ -170,7 +176,7 @@ class PermissionService
         });
 
         // Chunk through all bookshelves
-        $this->bookshelf->newQuery()->select(['id', 'restricted', 'created_by'])
+        $this->entityProvider->bookshelf->newQuery()->select(['id', 'restricted', 'created_by'])
             ->chunk(50, function ($shelves) use ($roles) {
                 $this->buildJointPermissionsForShelves($shelves, $roles);
             });
@@ -182,7 +188,8 @@ class PermissionService
      */
     protected function bookFetchQuery()
     {
-        return $this->book->newQuery()->select(['id', 'restricted', 'created_by'])->with(['chapters' => function ($query) {
+        return $this->entityProvider->book->newQuery()
+            ->select(['id', 'restricted', 'created_by'])->with(['chapters' => function ($query) {
             $query->select(['id', 'restricted', 'created_by', 'book_id']);
         }, 'pages'  => function ($query) {
             $query->select(['id', 'restricted', 'created_by', 'book_id', 'chapter_id']);
@@ -288,7 +295,7 @@ class PermissionService
         });
 
         // Chunk through all bookshelves
-        $this->bookshelf->newQuery()->select(['id', 'restricted', 'created_by'])
+        $this->entityProvider->bookshelf->newQuery()->select(['id', 'restricted', 'created_by'])
             ->chunk(50, function ($shelves) use ($roles) {
                 $this->buildJointPermissionsForShelves($shelves, $roles);
             });
@@ -602,7 +609,9 @@ class PermissionService
      */
     public function bookChildrenQuery($book_id, $filterDrafts = false, $fetchPageContent = false)
     {
-        $pageSelect = $this->db->table('pages')->selectRaw($this->page->entityRawQuery($fetchPageContent))->where('book_id', '=', $book_id)->where(function ($query) use ($filterDrafts) {
+        $entities = $this->entityProvider;
+        $pageSelect = $this->db->table('pages')->selectRaw($entities->page->entityRawQuery($fetchPageContent))
+            ->where('book_id', '=', $book_id)->where(function ($query) use ($filterDrafts) {
             $query->where('draft', '=', 0);
             if (!$filterDrafts) {
                 $query->orWhere(function ($query) {
@@ -610,7 +619,7 @@ class PermissionService
                 });
             }
         });
-        $chapterSelect = $this->db->table('chapters')->selectRaw($this->chapter->entityRawQuery())->where('book_id', '=', $book_id);
+        $chapterSelect = $this->db->table('chapters')->selectRaw($entities->chapter->entityRawQuery())->where('book_id', '=', $book_id);
         $query = $this->db->query()->select('*')->from($this->db->raw("({$pageSelect->toSql()} UNION {$chapterSelect->toSql()}) AS U"))
             ->mergeBindings($pageSelect)->mergeBindings($chapterSelect);
 
@@ -701,7 +710,7 @@ class PermissionService
         $this->currentAction = 'view';
         $tableDetails = ['tableName' => $tableName, 'entityIdColumn' => $entityIdColumn];
 
-        $pageMorphClass = $this->page->getMorphClass();
+        $pageMorphClass = $this->entityProvider->page->getMorphClass();
         $q = $query->where(function ($query) use ($tableDetails, $pageMorphClass) {
             $query->where(function ($query) use (&$tableDetails, $pageMorphClass) {
                 $query->whereExists(function ($permissionQuery) use (&$tableDetails, $pageMorphClass) {
index a46aba8db68f0afb3c48adade718c1a0c369f272..c1fd9df2cf845a98342d380145b96ef7540ef03f 100644 (file)
@@ -212,9 +212,9 @@ class UserRepo
     public function getAssetCounts(User $user)
     {
         return [
-            'pages'    => $this->entityRepo->page->where('created_by', '=', $user->id)->count(),
-            'chapters' => $this->entityRepo->chapter->where('created_by', '=', $user->id)->count(),
-            'books'    => $this->entityRepo->book->where('created_by', '=', $user->id)->count(),
+            'pages'    => $this->entityRepo->getUserTotalCreated('page', $user),
+            'chapters' => $this->entityRepo->getUserTotalCreated('chapter', $user),
+            'books'    => $this->entityRepo->getUserTotalCreated('book', $user),
         ];
     }
 
index 24c80afc5d0512fab76fb3a6dd21bf87ad39af3c..21d172e708ad48be7a969a5977c3c4897a9cee33 100644 (file)
@@ -7,8 +7,25 @@ use BookStack\Actions\View;
 use BookStack\Auth\Permissions\EntityPermission;
 use BookStack\Auth\Permissions\JointPermission;
 use BookStack\Ownable;
+use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Relations\MorphMany;
 
+/**
+ * Class Entity
+ * The base class for book-like items such as pages, chapters & books.
+ * This is not a database model in itself but extended.
+ *
+ * @property integer $id
+ * @property string $name
+ * @property string $slug
+ * @property Carbon $created_at
+ * @property Carbon $updated_at
+ * @property int $created_by
+ * @property int $updated_by
+ * @property boolean $restricted
+ *
+ * @package BookStack\Entities
+ */
 class Entity extends Ownable
 {
 
index 0442b9f44b98b850b21793dda58436018470925c..46a883ec408927661479c5d84fc8bab7cc5d5fed 100644 (file)
@@ -15,27 +15,27 @@ class EntityProvider
     /**
      * @var Bookshelf
      */
-    protected $bookshelf;
+    public $bookshelf;
 
     /**
      * @var Book
      */
-    protected $book;
+    public $book;
 
     /**
      * @var Chapter
      */
-    protected $chapter;
+    public $chapter;
 
     /**
      * @var Page
      */
-    protected $page;
+    public $page;
 
     /**
      * @var PageRevision
      */
-    protected $pageRevision;
+    public $pageRevision;
 
     /**
      * EntityProvider constructor.
@@ -74,5 +74,16 @@ class EntityProvider
         ];
     }
 
+    /**
+     * Get an entity instance by it's basic name.
+     * @param string $type
+     * @return Entity
+     */
+    public function get(string $type)
+    {
+        $type = strtolower($type);
+        return $this->all()[$type];
+    }
+
 
 }
\ No newline at end of file
index e2fe2307e1aaebad45bdd6626c1b23abc876fe12..cc29c34e6cf96648b8f350b0293c1a06307549e1 100644 (file)
@@ -3,46 +3,23 @@
 use BookStack\Actions\TagRepo;
 use BookStack\Actions\ViewService;
 use BookStack\Auth\Permissions\PermissionService;
+use BookStack\Auth\User;
 use BookStack\Exceptions\NotFoundException;
 use BookStack\Exceptions\NotifyException;
 use BookStack\Uploads\AttachmentService;
 use Carbon\Carbon;
 use DOMDocument;
 use DOMXPath;
+use Illuminate\Http\Request;
 use Illuminate\Support\Collection;
 
 class EntityRepo
 {
-    /**
-     * @var \BookStack\Entities\Bookshelf
-     */
-    public $bookshelf;
-
-    /**
-     * @var \BookStack\Entities\Book $book
-     */
-    public $book;
-
-    /**
-     * @var Chapter
-     */
-    public $chapter;
-
-    /**
-     * @var Page
-     */
-    public $page;
-
-    /**
-     * @var PageRevision
-     */
-    protected $pageRevision;
 
     /**
-     * Base entity instances keyed by type
-     * @var []Entity
+     * @var EntityProvider
      */
-    protected $entities;
+    protected $entityProvider;
 
     /**
      * @var PermissionService
@@ -55,7 +32,7 @@ class EntityRepo
     protected $viewService;
 
     /**
-     * @var \BookStack\Actions\TagRepo
+     * @var TagRepo
      */
     protected $tagRepo;
 
@@ -66,63 +43,36 @@ class EntityRepo
 
     /**
      * EntityRepo constructor.
-     * @param \BookStack\Entities\Bookshelf $bookshelf
-     * @param \BookStack\Entities\Book $book
-     * @param Chapter $chapter
-     * @param \BookStack\Entities\Page $page
-     * @param \BookStack\Entities\PageRevision $pageRevision
+     * @param EntityProvider $entityProvider
      * @param ViewService $viewService
      * @param PermissionService $permissionService
-     * @param \BookStack\Actions\TagRepo $tagRepo
+     * @param TagRepo $tagRepo
      * @param SearchService $searchService
      */
     public function __construct(
-        Bookshelf $bookshelf,
-        Book $book,
-        Chapter $chapter,
-        Page $page,
-        PageRevision $pageRevision,
+        EntityProvider $entityProvider,
         ViewService $viewService,
         PermissionService $permissionService,
         TagRepo $tagRepo,
         SearchService $searchService
     ) {
-        $this->bookshelf = $bookshelf;
-        $this->book = $book;
-        $this->chapter = $chapter;
-        $this->page = $page;
-        $this->pageRevision = $pageRevision;
-        $this->entities = [
-            'bookshelf' => $this->bookshelf,
-            'page' => $this->page,
-            'chapter' => $this->chapter,
-            'book' => $this->book
-        ];
+        $this->entityProvider = $entityProvider;
         $this->viewService = $viewService;
         $this->permissionService = $permissionService;
         $this->tagRepo = $tagRepo;
         $this->searchService = $searchService;
     }
 
-    /**
-     * Get an entity instance via type.
-     * @param $type
-     * @return \BookStack\Entities\Entity
-     */
-    protected function getEntity($type)
-    {
-        return $this->entities[strtolower($type)];
-    }
-
     /**
      * Base query for searching entities via permission system
      * @param string $type
      * @param bool $allowDrafts
+     * @param string $permission
      * @return \Illuminate\Database\Query\Builder
      */
     protected function entityQuery($type, $allowDrafts = false, $permission = 'view')
     {
-        $q = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type), $permission);
+        $q = $this->permissionService->enforceEntityRestrictions($type, $this->entityProvider->get($type), $permission);
         if (strtolower($type) === 'page' && !$allowDrafts) {
             $q = $q->where('draft', '=', false);
         }
@@ -150,11 +100,31 @@ class EntityRepo
      */
     public function getById($type, $id, $allowDrafts = false, $ignorePermissions = false)
     {
+        $query = $this->entityQuery($type, $allowDrafts);
+
+        if ($ignorePermissions) {
+            $query = $this->entityProvider->get($type)->newQuery();
+        }
+
+        return $query->find($id);
+    }
+
+    /**
+     * @param string $type
+     * @param []int $ids
+     * @param bool $allowDrafts
+     * @param bool $ignorePermissions
+     * @return \Illuminate\Database\Eloquent\Builder[]|\Illuminate\Database\Eloquent\Collection|Collection
+     */
+    public function getManyById($type, $ids, $allowDrafts = false, $ignorePermissions = false)
+    {
+        $query = $this->entityQuery($type, $allowDrafts);
+
         if ($ignorePermissions) {
-            $entity = $this->getEntity($type);
-            return $entity->newQuery()->find($id);
+            $query = $this->entityProvider->get($type)->newQuery();
         }
-        return $this->entityQuery($type, $allowDrafts)->find($id);
+
+        return $query->whereIn('id', $ids)->get();
     }
 
     /**
@@ -172,7 +142,7 @@ class EntityRepo
         if (strtolower($type) === 'chapter' || strtolower($type) === 'page') {
             $q = $q->where('book_id', '=', function ($query) use ($bookSlug) {
                 $query->select('id')
-                    ->from($this->book->getTable())
+                    ->from($this->entityProvider->book->getTable())
                     ->where('slug', '=', $bookSlug)->limit(1);
             });
         }
@@ -193,7 +163,7 @@ class EntityRepo
      */
     public function getPageByOldSlug($pageSlug, $bookSlug)
     {
-        $revision = $this->pageRevision->where('slug', '=', $pageSlug)
+        $revision = $this->entityProvider->pageRevision->where('slug', '=', $pageSlug)
             ->whereHas('page', function ($query) {
                 $this->permissionService->enforceEntityRestrictions('page', $query);
             })
@@ -241,7 +211,7 @@ class EntityRepo
      */
     public function getRecentlyCreated($type, $count = 20, $page = 0, $additionalQuery = false)
     {
-        $query = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type))
+        $query = $this->permissionService->enforceEntityRestrictions($type, $this->entityProvider->get($type))
             ->orderBy('created_at', 'desc');
         if (strtolower($type) === 'page') {
             $query = $query->where('draft', '=', false);
@@ -262,7 +232,7 @@ class EntityRepo
      */
     public function getRecentlyUpdated($type, $count = 20, $page = 0, $additionalQuery = false)
     {
-        $query = $this->permissionService->enforceEntityRestrictions($type, $this->getEntity($type))
+        $query = $this->permissionService->enforceEntityRestrictions($type, $this->entityProvider->get($type))
             ->orderBy('updated_at', 'desc');
         if (strtolower($type) === 'page') {
             $query = $query->where('draft', '=', false);
@@ -282,7 +252,7 @@ class EntityRepo
      */
     public function getRecentlyViewed($type, $count = 10, $page = 0)
     {
-        $filter = is_bool($type) ? false : $this->getEntity($type);
+        $filter = is_bool($type) ? false : $this->entityProvider->get($type);
         return $this->viewService->getUserRecentlyViewed($count, $page, $filter);
     }
 
@@ -317,7 +287,7 @@ class EntityRepo
      */
     public function getPopular($type, $count = 10, $page = 0)
     {
-        $filter = is_bool($type) ? false : $this->getEntity($type);
+        $filter = is_bool($type) ? false : $this->entityProvider->get($type);
         return $this->viewService->getPopular($count, $page, $filter);
     }
 
@@ -325,15 +295,28 @@ class EntityRepo
      * Get draft pages owned by the current user.
      * @param int $count
      * @param int $page
+     * @return Collection
      */
     public function getUserDraftPages($count = 20, $page = 0)
     {
-        return $this->page->where('draft', '=', true)
+        return $this->entityProvider->page->where('draft', '=', true)
             ->where('created_by', '=', user()->id)
             ->orderBy('updated_at', 'desc')
             ->skip($count * $page)->take($count)->get();
     }
 
+    /**
+     * Get the number of entities the given user has created.
+     * @param string $type
+     * @param User $user
+     * @return int
+     */
+    public function getUserTotalCreated(string $type, User $user)
+    {
+        return $this->entityProvider->get($type)
+            ->where('created_by', '=', $user->id)->count();
+    }
+
     /**
      * Get the child items for a chapter sorted by priority but
      * with draft items floated to the top.
@@ -362,14 +345,14 @@ class EntityRepo
         $tree = [];
 
         foreach ($q as $index => $rawEntity) {
-            if ($rawEntity->entity_type ===  $this->page->getMorphClass()) {
-                $entities[$index] = $this->page->newFromBuilder($rawEntity);
+            if ($rawEntity->entity_type ===  $this->entityProvider->page->getMorphClass()) {
+                $entities[$index] = $this->entityProvider->page->newFromBuilder($rawEntity);
                 if ($renderPages) {
                     $entities[$index]->html = $rawEntity->html;
                     $entities[$index]->html = $this->renderPage($entities[$index]);
                 };
-            } else if ($rawEntity->entity_type === $this->chapter->getMorphClass()) {
-                $entities[$index] = $this->chapter->newFromBuilder($rawEntity);
+            } else if ($rawEntity->entity_type === $this->entityProvider->chapter->getMorphClass()) {
+                $entities[$index] = $this->entityProvider->chapter->newFromBuilder($rawEntity);
                 $key = $entities[$index]->entity_type . ':' . $entities[$index]->id;
                 $parents[$key] = $entities[$index];
                 $parents[$key]->setAttribute('pages', collect());
@@ -384,7 +367,7 @@ class EntityRepo
             if ($entity->chapter_id === 0 || $entity->chapter_id === '0') {
                 continue;
             }
-            $parentKey = $this->chapter->getMorphClass() . ':' . $entity->chapter_id;
+            $parentKey = $this->entityProvider->chapter->getMorphClass() . ':' . $entity->chapter_id;
             if (!isset($parents[$parentKey])) {
                 $tree[] = $entity;
                 continue;
@@ -458,7 +441,7 @@ class EntityRepo
      */
     protected function slugExists($type, $slug, $currentId = false, $bookId = false)
     {
-        $query = $this->getEntity($type)->where('slug', '=', $slug);
+        $query = $this->entityProvider->get($type)->where('slug', '=', $slug);
         if (strtolower($type) === 'page' || strtolower($type) === 'chapter') {
             $query = $query->where('book_id', '=', $bookId);
         }
@@ -470,10 +453,11 @@ class EntityRepo
 
     /**
      * Updates entity restrictions from a request
-     * @param $request
+     * @param Request $request
      * @param \BookStack\Entities\Entity $entity
+     * @throws \Throwable
      */
-    public function updateEntityPermissionsFromRequest($request, Entity $entity)
+    public function updateEntityPermissionsFromRequest(Request $request, Entity $entity)
     {
         $entity->restricted = $request->get('restricted', '') === 'true';
         $entity->permissions()->delete();
@@ -506,7 +490,7 @@ class EntityRepo
     public function createFromInput($type, $input = [], $book = false)
     {
         $isChapter = strtolower($type) === 'chapter';
-        $entityModel = $this->getEntity($type)->newInstance($input);
+        $entityModel = $this->entityProvider->get($type)->newInstance($input);
         $entityModel->slug = $this->findSuitableSlug($type, $entityModel->name, false, $isChapter ? $book->id : false);
         $entityModel->created_by = user()->id;
         $entityModel->updated_by = user()->id;
@@ -637,7 +621,7 @@ class EntityRepo
      */
     public function getDraftPage(Book $book, $chapter = false)
     {
-        $page = $this->page->newInstance();
+        $page = $this->entityProvider->page->newInstance();
         $page->name = trans('entities.pages_initial_name');
         $page->created_by = user()->id;
         $page->updated_by = user()->id;
@@ -648,7 +632,7 @@ class EntityRepo
         }
 
         $book->pages()->save($page);
-        $page = $this->page->find($page->id);
+        $page = $this->entityProvider->page->find($page->id);
         $this->permissionService->buildJointPermissionsForEntity($page);
         return $page;
     }
@@ -726,7 +710,7 @@ class EntityRepo
      */
     public function savePageRevision(Page $page, $summary = null)
     {
-        $revision = $this->pageRevision->newInstance($page->toArray());
+        $revision = $this->entityProvider->pageRevision->newInstance($page->toArray());
         if (setting('app-editor') !== 'markdown') {
             $revision->markdown = '';
         }
@@ -742,10 +726,10 @@ class EntityRepo
 
         $revisionLimit = config('app.revision_limit');
         if ($revisionLimit !== false) {
-            $revisionsToDelete = $this->pageRevision->where('page_id', '=', $page->id)
+            $revisionsToDelete = $this->entityProvider->pageRevision->where('page_id', '=', $page->id)
                 ->orderBy('created_at', 'desc')->skip(intval($revisionLimit))->take(10)->get(['id']);
             if ($revisionsToDelete->count() > 0) {
-                $this->pageRevision->whereIn('id', $revisionsToDelete->pluck('id'))->delete();
+                $this->entityProvider->pageRevision->whereIn('id', $revisionsToDelete->pluck('id'))->delete();
             }
         }
 
@@ -1019,7 +1003,7 @@ class EntityRepo
      */
     protected function userUpdatePageDraftsQuery(Page $page, $userId)
     {
-        return $this->pageRevision->where('created_by', '=', $userId)
+        return $this->entityProvider->pageRevision->where('created_by', '=', $userId)
             ->where('type', 'update_draft')
             ->where('page_id', '=', $page->id)
             ->orderBy('created_at', 'desc');
@@ -1084,7 +1068,7 @@ class EntityRepo
      */
     protected function activePageEditingQuery(Page $page, $minRange = null)
     {
-        $query = $this->pageRevision->where('type', '=', 'update_draft')
+        $query = $this->entityProvider->pageRevision->where('type', '=', 'update_draft')
             ->where('page_id', '=', $page->id)
             ->where('updated_at', '>', $page->updated_at)
             ->where('created_by', '!=', user()->id)
@@ -1144,7 +1128,7 @@ class EntityRepo
         if ($drafts->count() > 0) {
             $draft = $drafts->first();
         } else {
-            $draft = $this->pageRevision->newInstance();
+            $draft = $this->entityProvider->pageRevision->newInstance();
             $draft->page_id = $page->id;
             $draft->slug = $page->slug;
             $draft->book_slug = $page->book->slug;
index 91e8a28e99d246ba701ba1a5f95b80ee1019bcab..9e7cfdd0cdf1c8de852ee88a5464b662580e6f5b 100644 (file)
@@ -2,24 +2,33 @@
 
 use BookStack\Auth\Permissions\PermissionService;
 use Illuminate\Database\Connection;
+use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
 use Illuminate\Database\Query\Builder;
 use Illuminate\Database\Query\JoinClause;
 use Illuminate\Support\Collection;
 
 class SearchService
 {
+    /**
+     * @var SearchTerm
+     */
     protected $searchTerm;
-    protected $bookshelf;
-    protected $book;
-    protected $chapter;
-    protected $page;
+
+    /**
+     * @var EntityProvider
+     */
+    protected $entityProvider;
+
+    /**
+     * @var Connection
+     */
     protected $db;
-    protected $permissionService;
 
     /**
-     * @var Entity[]
+     * @var PermissionService
      */
-    protected $entities;
+    protected $permissionService;
+
 
     /**
      * Acceptable operators to be used in a query
@@ -30,27 +39,15 @@ class SearchService
     /**
      * SearchService constructor.
      * @param SearchTerm $searchTerm
-     * @param Bookshelf $bookshelf
-     * @param \BookStack\Entities\Book $book
-     * @param \BookStack\Entities\Chapter $chapter
-     * @param Page $page
+     * @param EntityProvider $entityProvider
      * @param Connection $db
      * @param PermissionService $permissionService
      */
-    public function __construct(SearchTerm $searchTerm, Bookshelf $bookshelf, Book $book, Chapter $chapter, Page $page, Connection $db, PermissionService $permissionService)
+    public function __construct(SearchTerm $searchTerm, EntityProvider $entityProvider, Connection $db, PermissionService $permissionService)
     {
         $this->searchTerm = $searchTerm;
-        $this->bookshelf = $bookshelf;
-        $this->book = $book;
-        $this->chapter = $chapter;
-        $this->page = $page;
+        $this->entityProvider = $entityProvider;
         $this->db = $db;
-        $this->entities = [
-            'bookshelf' => $this->bookshelf,
-            'page' => $this->page,
-            'chapter' => $this->chapter,
-            'book' => $this->book
-        ];
         $this->permissionService = $permissionService;
     }
 
@@ -75,7 +72,7 @@ class SearchService
     public function searchEntities($searchString, $entityType = 'all', $page = 1, $count = 20, $action = 'view')
     {
         $terms = $this->parseSearchString($searchString);
-        $entityTypes = array_keys($this->entities);
+        $entityTypes = array_keys($this->entityProvider->all());
         $entityTypesToSearch = $entityTypes;
 
         if ($entityType !== 'all') {
@@ -172,17 +169,17 @@ class SearchService
      * @param array $terms
      * @param string $entityType
      * @param string $action
-     * @return \Illuminate\Database\Eloquent\Builder
+     * @return EloquentBuilder
      */
     protected function buildEntitySearchQuery($terms, $entityType = 'page', $action = 'view')
     {
-        $entity = $this->getEntity($entityType);
+        $entity = $this->entityProvider->get($entityType);
         $entitySelect = $entity->newQuery();
 
         // Handle normal search terms
         if (count($terms['search']) > 0) {
             $subQuery = $this->db->table('search_terms')->select('entity_id', 'entity_type', \DB::raw('SUM(score) as score'));
-            $subQuery->where('entity_type', '=', 'BookStack\\' . ucfirst($entityType));
+            $subQuery->where('entity_type', '=', $entity->getMorphClass());
             $subQuery->where(function (Builder $query) use ($terms) {
                 foreach ($terms['search'] as $inputTerm) {
                     $query->orWhere('term', 'like', $inputTerm .'%');
@@ -196,9 +193,9 @@ class SearchService
 
         // Handle exact term matching
         if (count($terms['exact']) > 0) {
-            $entitySelect->where(function (\Illuminate\Database\Eloquent\Builder $query) use ($terms, $entity) {
+            $entitySelect->where(function (EloquentBuilder $query) use ($terms, $entity) {
                 foreach ($terms['exact'] as $inputTerm) {
-                    $query->where(function (\Illuminate\Database\Eloquent\Builder $query) use ($inputTerm, $entity) {
+                    $query->where(function (EloquentBuilder $query) use ($inputTerm, $entity) {
                         $query->where('name', 'like', '%'.$inputTerm .'%')
                             ->orWhere($entity->textField, 'like', '%'.$inputTerm .'%');
                     });
@@ -286,14 +283,14 @@ class SearchService
 
     /**
      * Apply a tag search term onto a entity query.
-     * @param \Illuminate\Database\Eloquent\Builder $query
+     * @param EloquentBuilder $query
      * @param string $tagTerm
      * @return mixed
      */
-    protected function applyTagSearch(\Illuminate\Database\Eloquent\Builder $query, $tagTerm)
+    protected function applyTagSearch(EloquentBuilder $query, $tagTerm)
     {
         preg_match("/^(.*?)((".$this->getRegexEscapedOperators().")(.*?))?$/", $tagTerm, $tagSplit);
-        $query->whereHas('tags', function (\Illuminate\Database\Eloquent\Builder $query) use ($tagSplit) {
+        $query->whereHas('tags', function (EloquentBuilder $query) use ($tagSplit) {
             $tagName = $tagSplit[1];
             $tagOperator = count($tagSplit) > 2 ? $tagSplit[3] : '';
             $tagValue = count($tagSplit) > 3 ? $tagSplit[4] : '';
@@ -318,16 +315,6 @@ class SearchService
         return $query;
     }
 
-    /**
-     * Get an entity instance via type.
-     * @param $type
-     * @return Entity
-     */
-    protected function getEntity($type)
-    {
-        return $this->entities[strtolower($type)];
-    }
-
     /**
      * Index the given entity.
      * @param Entity $entity
@@ -375,7 +362,7 @@ class SearchService
     {
         $this->searchTerm->truncate();
 
-        foreach ($this->entities as $entityModel) {
+        foreach ($this->entityProvider->all() as $entityModel) {
             $selectFields = ['id', 'name', $entityModel->textField];
             $entityModel->newQuery()->select($selectFields)->chunk(1000, function ($entities) {
                 $this->indexEntities($entities);
@@ -429,7 +416,7 @@ class SearchService
      * Custom entity search filters
      */
 
-    protected function filterUpdatedAfter(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterUpdatedAfter(EloquentBuilder $query, Entity $model, $input)
     {
         try {
             $date = date_create($input);
@@ -439,7 +426,7 @@ class SearchService
         $query->where('updated_at', '>=', $date);
     }
 
-    protected function filterUpdatedBefore(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterUpdatedBefore(EloquentBuilder $query, Entity $model, $input)
     {
         try {
             $date = date_create($input);
@@ -449,7 +436,7 @@ class SearchService
         $query->where('updated_at', '<', $date);
     }
 
-    protected function filterCreatedAfter(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterCreatedAfter(EloquentBuilder $query, Entity $model, $input)
     {
         try {
             $date = date_create($input);
@@ -459,7 +446,7 @@ class SearchService
         $query->where('created_at', '>=', $date);
     }
 
-    protected function filterCreatedBefore(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterCreatedBefore(EloquentBuilder $query, Entity $model, $input)
     {
         try {
             $date = date_create($input);
@@ -469,7 +456,7 @@ class SearchService
         $query->where('created_at', '<', $date);
     }
 
-    protected function filterCreatedBy(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterCreatedBy(EloquentBuilder $query, Entity $model, $input)
     {
         if (!is_numeric($input) && $input !== 'me') {
             return;
@@ -480,7 +467,7 @@ class SearchService
         $query->where('created_by', '=', $input);
     }
 
-    protected function filterUpdatedBy(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterUpdatedBy(EloquentBuilder $query, Entity $model, $input)
     {
         if (!is_numeric($input) && $input !== 'me') {
             return;
@@ -491,41 +478,41 @@ class SearchService
         $query->where('updated_by', '=', $input);
     }
 
-    protected function filterInName(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterInName(EloquentBuilder $query, Entity $model, $input)
     {
         $query->where('name', 'like', '%' .$input. '%');
     }
 
-    protected function filterInTitle(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterInTitle(EloquentBuilder $query, Entity $model, $input)
     {
         $this->filterInName($query, $model, $input);
     }
 
-    protected function filterInBody(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterInBody(EloquentBuilder $query, Entity $model, $input)
     {
         $query->where($model->textField, 'like', '%' .$input. '%');
     }
 
-    protected function filterIsRestricted(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterIsRestricted(EloquentBuilder $query, Entity $model, $input)
     {
         $query->where('restricted', '=', true);
     }
 
-    protected function filterViewedByMe(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterViewedByMe(EloquentBuilder $query, Entity $model, $input)
     {
         $query->whereHas('views', function ($query) {
             $query->where('user_id', '=', user()->id);
         });
     }
 
-    protected function filterNotViewedByMe(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterNotViewedByMe(EloquentBuilder $query, Entity $model, $input)
     {
         $query->whereDoesntHave('views', function ($query) {
             $query->where('user_id', '=', user()->id);
         });
     }
 
-    protected function filterSortBy(\Illuminate\Database\Eloquent\Builder $query, Entity $model, $input)
+    protected function filterSortBy(EloquentBuilder $query, Entity $model, $input)
     {
         $functionName = camel_case('sort_by_' . $input);
         if (method_exists($this, $functionName)) {
@@ -538,7 +525,7 @@ class SearchService
      * Sorting filter options
      */
 
-    protected function sortByLastCommented(\Illuminate\Database\Eloquent\Builder $query, Entity $model)
+    protected function sortByLastCommented(EloquentBuilder $query, Entity $model)
     {
         $commentsTable = $this->db->getTablePrefix() . 'comments';
         $morphClass = str_replace('\\', '\\\\', $model->getMorphClass());
index 5a9eadaf884565d222783e306706d4310a1ae0ea..212eedc2c01305577e989d876b04436440840244 100644 (file)
@@ -204,7 +204,7 @@ class BookController extends Controller
 
         // Get the books involved in the sort
         $bookIdsInvolved = $bookIdsInvolved->unique()->toArray();
-        $booksInvolved = $this->entityRepo->book->newQuery()->whereIn('id', $bookIdsInvolved)->get();
+        $booksInvolved = $this->entityRepo->getManyById('book', $bookIdsInvolved, false, true);
         // Throw permission error if invalid ids or inaccessible books given.
         if (count($bookIdsInvolved) !== count($booksInvolved)) {
             $this->showPermissionError();
index 11c1408eb1a8ed926bac71d2796b3b3f69e7d9c3..eb9a0fe68e02b60eb605911e12d6c8ca40e3fa87 100644 (file)
@@ -21,7 +21,7 @@ class Attachment extends Ownable
 
     /**
      * Get the page this file was uploaded to.
-     * @return Page
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
      */
     public function page()
     {
index df57b13457e0ad7826650b2a7c717787e004ce5d..0ef8cad48020dcd8314b19669e9a3f4e2567eb4e 100644 (file)
@@ -16,7 +16,7 @@ class ImageRepo
      * ImageRepo constructor.
      * @param Image $image
      * @param ImageService $imageService
-     * @param \BookStack\Auth\\BookStack\Auth\Permissions\PermissionService $permissionService
+     * @param \BookStack\Auth\Permissions\PermissionService $permissionService
      * @param \BookStack\Entities\Page $page
      */
     public function __construct(Image $image, ImageService $imageService, PermissionService $permissionService, Page $page)