X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/30214fde74c954ee6cf4daeb562764343b546b58..refs/pull/139/head:/app/Repos/PageRepo.php diff --git a/app/Repos/PageRepo.php b/app/Repos/PageRepo.php index 776d1eadf..de050e1c7 100644 --- a/app/Repos/PageRepo.php +++ b/app/Repos/PageRepo.php @@ -1,8 +1,9 @@ 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(); }