]> BookStack Code Mirror - bookstack/blobdiff - app/Repos/PageRepo.php
replace GPL diff lib with MIT lib
[bookstack] / app / Repos / PageRepo.php
index bfb0e70a7b4b77a65571cda0c25cba0c35caab3b..de050e1c7cb8ad245157f81316c6305c2fdff87a 100644 (file)
@@ -3,6 +3,7 @@
 use Activity;
 use BookStack\Book;
 use BookStack\Chapter;
+use BookStack\Entity;
 use BookStack\Exceptions\NotFoundException;
 use Carbon\Carbon;
 use DOMDocument;
@@ -14,14 +15,17 @@ class PageRepo extends EntityRepo
 {
 
     protected $pageRevision;
+    protected $tagRepo;
 
     /**
      * PageRepo constructor.
      * @param PageRevision $pageRevision
+     * @param TagRepo $tagRepo
      */
-    public function __construct(PageRevision $pageRevision)
+    public function __construct(PageRevision $pageRevision, TagRepo $tagRepo)
     {
         $this->pageRevision = $pageRevision;
+        $this->tagRepo = $tagRepo;
         parent::__construct();
     }
 
@@ -32,7 +36,7 @@ class PageRepo extends EntityRepo
      */
     private function pageQuery($allowDrafts = false)
     {
-        $query = $this->restrictionService->enforcePageRestrictions($this->page, 'view');
+        $query = $this->permissionService->enforcePageRestrictions($this->page, 'view');
         if (!$allowDrafts) {
             $query = $query->where('draft', '=', false);
         }
@@ -76,7 +80,7 @@ class PageRepo extends EntityRepo
     {
         $revision = $this->pageRevision->where('slug', '=', $pageSlug)
             ->whereHas('page', function ($query) {
-                $this->restrictionService->enforcePageRestrictions($query);
+                $this->permissionService->enforcePageRestrictions($query);
             })
             ->where('type', '=', 'version')
             ->where('book_slug', '=', $bookSlug)->orderBy('created_at', 'desc')
@@ -142,6 +146,11 @@ class PageRepo extends EntityRepo
     {
         $draftPage->fill($input);
 
+        // Save page tags if present
+        if(isset($input['tags'])) {
+            $this->tagRepo->saveTagsToEntity($draftPage, $input['tags']);
+        }
+
         $draftPage->slug = $this->findSuitableSlug($draftPage->name, $draftPage->book->id);
         $draftPage->html = $this->formatHtml($input['html']);
         $draftPage->text = strip_tags($draftPage->html);
@@ -168,7 +177,7 @@ class PageRepo extends EntityRepo
         if ($chapter) $page->chapter_id = $chapter->id;
 
         $book->pages()->save($page);
-        $this->restrictionService->buildEntityPermissionsForEntity($page);
+        $this->permissionService->buildJointPermissionsForEntity($page);
         return $page;
     }
 
@@ -242,8 +251,9 @@ class PageRepo extends EntityRepo
     public function getBySearch($term, $whereTerms = [], $count = 20, $paginationAppends = [])
     {
         $terms = $this->prepareSearchTerms($term);
-        $pages = $this->restrictionService->enforcePageRestrictions($this->page->fullTextSearchQuery(['name', 'text'], $terms, $whereTerms))
-            ->paginate($count)->appends($paginationAppends);
+        $pageQuery = $this->permissionService->enforcePageRestrictions($this->page->fullTextSearchQuery(['name', 'text'], $terms, $whereTerms));
+        $pageQuery = $this->addAdvancedSearchQueries($pageQuery, $term);
+        $pages = $pageQuery->paginate($count)->appends($paginationAppends);
 
         // Add highlights to page text.
         $words = join('|', explode(' ', preg_quote(trim($term), '/')));
@@ -308,6 +318,11 @@ class PageRepo extends EntityRepo
             $page->slug = $this->findSuitableSlug($input['name'], $book_id, $page->id);
         }
 
+        // Save page tags if present
+        if(isset($input['tags'])) {
+            $this->tagRepo->saveTagsToEntity($page, $input['tags']);
+        }
+
         // Update with new details
         $userId = auth()->user()->id;
         $page->fill($input);
@@ -558,6 +573,22 @@ class PageRepo extends EntityRepo
         return $page;
     }
 
+
+    /**
+     * Change the page's parent to the given entity.
+     * @param Page $page
+     * @param Entity $parent
+     */
+    public function changePageParent(Page $page, Entity $parent)
+    {
+        $book = $parent->isA('book') ? $parent : $parent->book;
+        $page->chapter_id = $parent->isA('chapter') ? $parent->id : 0;
+        $page->save();
+        $page = $this->changeBook($book->id, $page);
+        $page->load('book');
+        $this->permissionService->buildJointPermissionsForEntity($book);
+    }
+
     /**
      * Gets a suitable slug for the resource
      * @param            $name
@@ -578,13 +609,14 @@ class PageRepo extends EntityRepo
      * Destroy a given page along with its dependencies.
      * @param $page
      */
-    public function destroy($page)
+    public function destroy(Page $page)
     {
         Activity::removeEntity($page);
         $page->views()->delete();
+        $page->tags()->delete();
         $page->revisions()->delete();
-        $page->restrictions()->delete();
-        $this->restrictionService->deleteEntityPermissionsForEntity($page);
+        $page->permissions()->delete();
+        $this->permissionService->deleteJointPermissionsForEntity($page);
         $page->delete();
     }