]> BookStack Code Mirror - bookstack/blobdiff - app/Repos/PageRepo.php
replace GPL diff lib with MIT lib
[bookstack] / app / Repos / PageRepo.php
index 776d1eadf30c594bea49688bfc696d228278e021..de050e1c7cb8ad245157f81316c6305c2fdff87a 100644 (file)
@@ -1,8 +1,9 @@
 <?php namespace BookStack\Repos;
 
-
 use Activity;
 use BookStack\Book;
+use BookStack\Chapter;
+use BookStack\Entity;
 use BookStack\Exceptions\NotFoundException;
 use Carbon\Carbon;
 use DOMDocument;
@@ -12,35 +13,45 @@ use BookStack\PageRevision;
 
 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();
     }
 
     /**
      * Base query for getting pages, Takes restrictions into account.
+     * @param bool $allowDrafts
      * @return mixed
      */
-    private function pageQuery()
+    private function pageQuery($allowDrafts = false)
     {
-        return $this->restrictionService->enforcePageRestrictions($this->page, 'view');
+        $query = $this->permissionService->enforcePageRestrictions($this->page, 'view');
+        if (!$allowDrafts) {
+            $query = $query->where('draft', '=', false);
+        }
+        return $query;
     }
 
     /**
      * Get a page via a specific ID.
      * @param $id
+     * @param bool $allowDrafts
      * @return mixed
      */
-    public function getById($id)
+    public function getById($id, $allowDrafts = false)
     {
-        return $this->pageQuery()->findOrFail($id);
+        return $this->pageQuery($allowDrafts)->findOrFail($id);
     }
 
     /**
@@ -69,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')
@@ -123,6 +134,53 @@ class PageRepo extends EntityRepo
         return $page;
     }
 
+
+    /**
+     * Publish a draft page to make it a normal page.
+     * Sets the slug and updates the content.
+     * @param Page $draftPage
+     * @param array $input
+     * @return Page
+     */
+    public function publishDraft(Page $draftPage, array $input)
+    {
+        $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);
+        $draftPage->draft = false;
+
+        $draftPage->save();
+        return $draftPage;
+    }
+
+    /**
+     * Get a new draft page instance.
+     * @param Book $book
+     * @param Chapter|bool $chapter
+     * @return static
+     */
+    public function getDraftPage(Book $book, $chapter = false)
+    {
+        $page = $this->page->newInstance();
+        $page->name = 'New Page';
+        $page->created_by = auth()->user()->id;
+        $page->updated_by = auth()->user()->id;
+        $page->draft = true;
+
+        if ($chapter) $page->chapter_id = $chapter->id;
+
+        $book->pages()->save($page);
+        $this->permissionService->buildJointPermissionsForEntity($page);
+        return $page;
+    }
+
     /**
      * Formats a page's html to be tagged correctly
      * within the system.
@@ -193,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), '/')));
@@ -259,11 +318,17 @@ 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);
         $page->html = $this->formatHtml($input['html']);
         $page->text = strip_tags($page->html);
+        if (setting('app-editor') !== 'markdown') $page->markdown = '';
         $page->updated_by = $userId;
         $page->save();
 
@@ -300,6 +365,7 @@ class PageRepo extends EntityRepo
     public function saveRevision(Page $page)
     {
         $revision = $this->pageRevision->fill($page->toArray());
+        if (setting('app-editor') !== 'markdown') $revision->markdown = '';
         $revision->page_id = $page->id;
         $revision->slug = $page->slug;
         $revision->book_slug = $page->book->slug;
@@ -338,10 +404,30 @@ class PageRepo extends EntityRepo
         }
 
         $draft->fill($data);
+        if (setting('app-editor') !== 'markdown') $draft->markdown = '';
+        
         $draft->save();
         return $draft;
     }
 
+    /**
+     * Update a draft page.
+     * @param Page $page
+     * @param array $data
+     * @return Page
+     */
+    public function updateDraftPage(Page $page, $data = [])
+    {
+        $page->fill($data);
+
+        if (isset($data['html'])) {
+            $page->text = strip_tags($data['html']);
+        }
+
+        $page->save();
+        return $page;
+    }
+
     /**
      * The base query for getting user update drafts.
      * @param Page $page
@@ -432,6 +518,7 @@ class PageRepo extends EntityRepo
     private function activePageEditingQuery(Page $page, $minRange = null)
     {
         $query = $this->pageRevision->where('type', '=', 'update_draft')
+            ->where('page_id', '=', $page->id)
             ->where('updated_at', '>', $page->updated_at)
             ->where('created_by', '!=', auth()->user()->id)
             ->with('createdBy');
@@ -486,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
@@ -506,12 +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();
+        $page->permissions()->delete();
+        $this->permissionService->deleteJointPermissionsForEntity($page);
         $page->delete();
     }