| 
									
										
										
										
											2015-09-11 02:31:09 +08:00
										 |  |  | <?php namespace BookStack\Repos; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  | use Activity; | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  | use BookStack\Book; | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  | use BookStack\Chapter; | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  | use BookStack\Exceptions\NotFoundException; | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  | use Carbon\Carbon; | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  | use DOMDocument; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  | use Illuminate\Support\Str; | 
					
						
							| 
									
										
										
										
											2015-09-11 02:31:09 +08:00
										 |  |  | use BookStack\Page; | 
					
						
							|  |  |  | use BookStack\PageRevision; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 03:00:26 +08:00
										 |  |  | class PageRepo extends EntityRepo | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |     protected $pageRevision; | 
					
						
							| 
									
										
										
										
											2016-05-15 17:39:17 +08:00
										 |  |  |     protected $tagRepo; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * PageRepo constructor. | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |      * @param PageRevision $pageRevision | 
					
						
							| 
									
										
										
										
											2016-05-15 17:39:17 +08:00
										 |  |  |      * @param TagRepo $tagRepo | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-05-15 17:39:17 +08:00
										 |  |  |     public function __construct(PageRevision $pageRevision, TagRepo $tagRepo) | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         $this->pageRevision = $pageRevision; | 
					
						
							| 
									
										
										
										
											2016-05-15 17:39:17 +08:00
										 |  |  |         $this->tagRepo = $tagRepo; | 
					
						
							| 
									
										
										
										
											2016-03-06 03:00:26 +08:00
										 |  |  |         parent::__construct(); | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |      * Base query for getting pages, Takes restrictions into account. | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |      * @param bool $allowDrafts | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |      * @return mixed | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     private function pageQuery($allowDrafts = false) | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $query = $this->permissionService->enforcePageRestrictions($this->page, 'view'); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         if (!$allowDrafts) { | 
					
						
							|  |  |  |             $query = $query->where('draft', '=', false); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $query; | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get a page via a specific ID. | 
					
						
							|  |  |  |      * @param $id | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |      * @param bool $allowDrafts | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     public function getById($id, $allowDrafts = false) | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         return $this->pageQuery($allowDrafts)->findOrFail($id); | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get a page identified by the given slug. | 
					
						
							|  |  |  |      * @param $slug | 
					
						
							|  |  |  |      * @param $bookId | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-16 05:55:49 +08:00
										 |  |  |     public function getBySlug($slug, $bookId) | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         $page = $this->pageQuery()->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first(); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |         if ($page === null) throw new NotFoundException('Page not found'); | 
					
						
							| 
									
										
										
										
											2015-12-29 01:19:23 +08:00
										 |  |  |         return $page; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-02-26 04:01:59 +08:00
										 |  |  |      * Search through page revisions and retrieve | 
					
						
							|  |  |  |      * the last page in the current book that | 
					
						
							|  |  |  |      * has a slug equal to the one given. | 
					
						
							|  |  |  |      * @param $pageSlug | 
					
						
							|  |  |  |      * @param $bookSlug | 
					
						
							|  |  |  |      * @return null | Page | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function findPageUsingOldSlug($pageSlug, $bookSlug) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $revision = $this->pageRevision->where('slug', '=', $pageSlug) | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |             ->whereHas('page', function ($query) { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |                 $this->permissionService->enforcePageRestrictions($query); | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |             }) | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |             ->where('type', '=', 'version') | 
					
						
							| 
									
										
										
										
											2016-02-26 04:01:59 +08:00
										 |  |  |             ->where('book_slug', '=', $bookSlug)->orderBy('created_at', 'desc') | 
					
						
							|  |  |  |             ->with('page')->first(); | 
					
						
							|  |  |  |         return $revision !== null ? $revision->page : null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get a new Page instance from the given input. | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |      * @param $input | 
					
						
							|  |  |  |      * @return Page | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     public function newFromInput($input) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = $this->page->fill($input); | 
					
						
							|  |  |  |         return $page; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Count the pages with a particular slug within a book. | 
					
						
							|  |  |  |      * @param $slug | 
					
						
							|  |  |  |      * @param $bookId | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     public function countBySlug($slug, $bookId) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->page->where('slug', '=', $slug)->where('book_id', '=', $bookId)->count(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Save a new page into the system. | 
					
						
							|  |  |  |      * Input validation must be done beforehand. | 
					
						
							|  |  |  |      * @param array $input | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |      * @param Book $book | 
					
						
							|  |  |  |      * @param int $chapterId | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |      * @return Page | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function saveNew(array $input, Book $book, $chapterId = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $page = $this->newFromInput($input); | 
					
						
							|  |  |  |         $page->slug = $this->findSuitableSlug($page->name, $book->id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($chapterId) $page->chapter_id = $chapterId; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $page->html = $this->formatHtml($input['html']); | 
					
						
							|  |  |  |         $page->text = strip_tags($page->html); | 
					
						
							|  |  |  |         $page->created_by = auth()->user()->id; | 
					
						
							|  |  |  |         $page->updated_by = auth()->user()->id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $book->pages()->save($page); | 
					
						
							|  |  |  |         return $page; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-15 21:15:05 +08:00
										 |  |  |         // Save page tags if present
 | 
					
						
							|  |  |  |         if(isset($input['tags'])) { | 
					
						
							|  |  |  |             $this->tagRepo->saveTagsToEntity($draftPage, $input['tags']); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         $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 | 
					
						
							| 
									
										
										
										
											2016-04-16 02:51:27 +08:00
										 |  |  |      * @param Chapter|bool $chapter | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |      * @return static | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-16 02:51:27 +08:00
										 |  |  |     public function getDraftPage(Book $book, $chapter = false) | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $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); | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $this->permissionService->buildJointPermissionsForEntity($page); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         return $page; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Formats a page's html to be tagged correctly | 
					
						
							|  |  |  |      * within the system. | 
					
						
							|  |  |  |      * @param string $htmlText | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function formatHtml($htmlText) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |         if ($htmlText == '') return $htmlText; | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |         libxml_use_internal_errors(true); | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |         $doc = new DOMDocument(); | 
					
						
							| 
									
										
										
										
											2016-02-21 00:31:21 +08:00
										 |  |  |         $doc->loadHTML(mb_convert_encoding($htmlText, 'HTML-ENTITIES', 'UTF-8')); | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $container = $doc->documentElement; | 
					
						
							| 
									
										
										
										
											2015-10-12 00:45:32 +08:00
										 |  |  |         $body = $container->childNodes->item(0); | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |         $childNodes = $body->childNodes; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Ensure no duplicate ids are used
 | 
					
						
							|  |  |  |         $idArray = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($childNodes as $index => $childNode) { | 
					
						
							|  |  |  |             /** @var \DOMElement $childNode */ | 
					
						
							|  |  |  |             if (get_class($childNode) !== 'DOMElement') continue; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-21 19:29:46 +08:00
										 |  |  |             // Overwrite id if not a BookStack custom id
 | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |             if ($childNode->hasAttribute('id')) { | 
					
						
							|  |  |  |                 $id = $childNode->getAttribute('id'); | 
					
						
							|  |  |  |                 if (strpos($id, 'bkmrk') === 0 && array_search($id, $idArray) === false) { | 
					
						
							|  |  |  |                     $idArray[] = $id; | 
					
						
							|  |  |  |                     continue; | 
					
						
							|  |  |  |                 }; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Create an unique id for the element
 | 
					
						
							| 
									
										
										
										
											2016-02-21 19:29:46 +08:00
										 |  |  |             // Uses the content as a basis to ensure output is the same every time
 | 
					
						
							|  |  |  |             // the same content is passed through.
 | 
					
						
							|  |  |  |             $contentId = 'bkmrk-' . substr(strtolower(preg_replace('/\s+/', '-', trim($childNode->nodeValue))), 0, 20); | 
					
						
							|  |  |  |             $newId = urlencode($contentId); | 
					
						
							|  |  |  |             $loopIndex = 0; | 
					
						
							|  |  |  |             while (in_array($newId, $idArray)) { | 
					
						
							|  |  |  |                 $newId = urlencode($contentId . '-' . $loopIndex); | 
					
						
							|  |  |  |                 $loopIndex++; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-21 19:29:46 +08:00
										 |  |  |             $childNode->setAttribute('id', $newId); | 
					
						
							|  |  |  |             $idArray[] = $newId; | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Generate inner html as a string
 | 
					
						
							|  |  |  |         $html = ''; | 
					
						
							|  |  |  |         foreach ($childNodes as $childNode) { | 
					
						
							|  |  |  |             $html .= $doc->saveHTML($childNode); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $html; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Gets pages by a search term. | 
					
						
							|  |  |  |      * Highlights page content for showing in results. | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |      * @param string $term | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |      * @param array $whereTerms | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |      * @param int $count | 
					
						
							|  |  |  |      * @param array $paginationAppends | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |     public function getBySearch($term, $whereTerms = [], $count = 20, $paginationAppends = []) | 
					
						
							| 
									
										
										
										
											2015-07-17 02:53:24 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-03-06 03:00:26 +08:00
										 |  |  |         $terms = $this->prepareSearchTerms($term); | 
					
						
							| 
									
										
										
										
											2016-05-15 20:41:18 +08:00
										 |  |  |         $pageQuery = $this->permissionService->enforcePageRestrictions($this->page->fullTextSearchQuery(['name', 'text'], $terms, $whereTerms)); | 
					
						
							|  |  |  |         $pageQuery = $this->addAdvancedSearchQueries($pageQuery, $term); | 
					
						
							|  |  |  |         $pages = $pageQuery->paginate($count)->appends($paginationAppends); | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Add highlights to page text.
 | 
					
						
							| 
									
										
										
										
											2015-12-29 23:37:13 +08:00
										 |  |  |         $words = join('|', explode(' ', preg_quote(trim($term), '/'))); | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |         //lookahead/behind assertions ensures cut between words
 | 
					
						
							|  |  |  |         $s = '\s\x00-/:-@\[-`{-~'; //character set for start/end of words
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($pages as $page) { | 
					
						
							|  |  |  |             preg_match_all('#(?<=[' . $s . ']).{1,30}((' . $words . ').{1,30})+(?=[' . $s . '])#uis', $page->text, $matches, PREG_SET_ORDER); | 
					
						
							|  |  |  |             //delimiter between occurrences
 | 
					
						
							|  |  |  |             $results = []; | 
					
						
							|  |  |  |             foreach ($matches as $line) { | 
					
						
							|  |  |  |                 $results[] = htmlspecialchars($line[0], 0, 'UTF-8'); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $matchLimit = 6; | 
					
						
							|  |  |  |             if (count($results) > $matchLimit) { | 
					
						
							|  |  |  |                 $results = array_slice($results, 0, $matchLimit); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $result = join('... ', $results); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             //highlight
 | 
					
						
							|  |  |  |             $result = preg_replace('#' . $words . '#iu', "<span class=\"highlight\">\$0</span>", $result); | 
					
						
							|  |  |  |             if (strlen($result) < 5) { | 
					
						
							|  |  |  |                 $result = $page->getExcerpt(80); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             $page->searchSnippet = $result; | 
					
						
							| 
									
										
										
										
											2015-07-17 02:53:24 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |         return $pages; | 
					
						
							| 
									
										
										
										
											2015-07-17 02:53:24 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-02 01:28:50 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Search for image usage. | 
					
						
							|  |  |  |      * @param $imageString | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function searchForImage($imageString) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         $pages = $this->pageQuery()->where('html', 'like', '%' . $imageString . '%')->get(); | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |         foreach ($pages as $page) { | 
					
						
							| 
									
										
										
										
											2015-09-02 01:28:50 +08:00
										 |  |  |             $page->url = $page->getUrl(); | 
					
						
							|  |  |  |             $page->html = ''; | 
					
						
							|  |  |  |             $page->text = ''; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return count($pages) > 0 ? $pages : false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Updates a page with any fillable data and saves it into the database. | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @param int $book_id | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |      * @param string $input | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |      * @return Page | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |     public function updatePage(Page $page, $book_id, $input) | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |         // Save a revision before updating
 | 
					
						
							|  |  |  |         if ($page->html !== $input['html'] || $page->name !== $input['name']) { | 
					
						
							|  |  |  |             $this->saveRevision($page); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-26 04:01:59 +08:00
										 |  |  |         // Prevent slug being updated if no name change
 | 
					
						
							|  |  |  |         if ($page->name !== $input['name']) { | 
					
						
							|  |  |  |             $page->slug = $this->findSuitableSlug($input['name'], $book_id, $page->id); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-15 17:39:17 +08:00
										 |  |  |         // Save page tags if present
 | 
					
						
							|  |  |  |         if(isset($input['tags'])) { | 
					
						
							|  |  |  |             $this->tagRepo->saveTagsToEntity($page, $input['tags']); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |         // Update with new details
 | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |         $userId = auth()->user()->id; | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |         $page->fill($input); | 
					
						
							|  |  |  |         $page->html = $this->formatHtml($input['html']); | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         $page->text = strip_tags($page->html); | 
					
						
							| 
									
										
										
										
											2016-03-30 02:26:13 +08:00
										 |  |  |         if (setting('app-editor') !== 'markdown') $page->markdown = ''; | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |         $page->updated_by = $userId; | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         $page->save(); | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Remove all update drafts for this user & page.
 | 
					
						
							|  |  |  |         $this->userUpdateDraftsQuery($page, $userId)->delete(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |         return $page; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Restores a revision's content back into a page. | 
					
						
							|  |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @param Book $book | 
					
						
							|  |  |  |      * @param  int $revisionId | 
					
						
							|  |  |  |      * @return Page | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function restoreRevision(Page $page, Book $book, $revisionId) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         $this->saveRevision($page); | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |         $revision = $this->getRevisionById($revisionId); | 
					
						
							|  |  |  |         $page->fill($revision->toArray()); | 
					
						
							|  |  |  |         $page->slug = $this->findSuitableSlug($page->name, $book->id, $page->id); | 
					
						
							|  |  |  |         $page->text = strip_tags($page->html); | 
					
						
							|  |  |  |         $page->updated_by = auth()->user()->id; | 
					
						
							|  |  |  |         $page->save(); | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         return $page; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Saves a page revision into the system. | 
					
						
							|  |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @return $this | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-12-16 03:53:46 +08:00
										 |  |  |     public function saveRevision(Page $page) | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $revision = $this->pageRevision->fill($page->toArray()); | 
					
						
							| 
									
										
										
										
											2016-03-30 02:26:13 +08:00
										 |  |  |         if (setting('app-editor') !== 'markdown') $revision->markdown = ''; | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         $revision->page_id = $page->id; | 
					
						
							| 
									
										
										
										
											2016-02-26 04:01:59 +08:00
										 |  |  |         $revision->slug = $page->slug; | 
					
						
							|  |  |  |         $revision->book_slug = $page->book->slug; | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |         $revision->created_by = auth()->user()->id; | 
					
						
							|  |  |  |         $revision->created_at = $page->updated_at; | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |         $revision->type = 'version'; | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         $revision->save(); | 
					
						
							|  |  |  |         // Clear old revisions
 | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |         if ($this->pageRevision->where('page_id', '=', $page->id)->count() > 50) { | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |             $this->pageRevision->where('page_id', '=', $page->id) | 
					
						
							|  |  |  |                 ->orderBy('created_at', 'desc')->skip(50)->take(5)->delete(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $revision; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Save a page update draft. | 
					
						
							|  |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @param array $data | 
					
						
							|  |  |  |      * @return PageRevision | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function saveUpdateDraft(Page $page, $data = []) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $userId = auth()->user()->id; | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |         $drafts = $this->userUpdateDraftsQuery($page, $userId)->get(); | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($drafts->count() > 0) { | 
					
						
							|  |  |  |             $draft = $drafts->first(); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $draft = $this->pageRevision->newInstance(); | 
					
						
							|  |  |  |             $draft->page_id = $page->id; | 
					
						
							|  |  |  |             $draft->slug = $page->slug; | 
					
						
							|  |  |  |             $draft->book_slug = $page->book->slug; | 
					
						
							|  |  |  |             $draft->created_by = $userId; | 
					
						
							|  |  |  |             $draft->type = 'update_draft'; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $draft->fill($data); | 
					
						
							| 
									
										
										
										
											2016-03-30 02:26:13 +08:00
										 |  |  |         if (setting('app-editor') !== 'markdown') $draft->markdown = ''; | 
					
						
							|  |  |  |          | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |         $draft->save(); | 
					
						
							|  |  |  |         return $draft; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * 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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * The base query for getting user update drafts. | 
					
						
							|  |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @param $userId | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function userUpdateDraftsQuery(Page $page, $userId) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->pageRevision->where('created_by', '=', $userId) | 
					
						
							|  |  |  |             ->where('type', 'update_draft') | 
					
						
							|  |  |  |             ->where('page_id', '=', $page->id) | 
					
						
							|  |  |  |             ->orderBy('created_at', 'desc'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Checks whether a user has a draft version of a particular page or not. | 
					
						
							|  |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @param $userId | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function hasUserGotPageDraft(Page $page, $userId) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->userUpdateDraftsQuery($page, $userId)->count() > 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the latest updated draft revision for a particular page and user. | 
					
						
							|  |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @param $userId | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getUserPageDraft(Page $page, $userId) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->userUpdateDraftsQuery($page, $userId)->first(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the notification message that informs the user that they are editing a draft page. | 
					
						
							|  |  |  |      * @param PageRevision $draft | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getUserPageDraftMessage(PageRevision $draft) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $message = 'You are currently editing a draft that was last saved ' . $draft->updated_at->diffForHumans() . '.'; | 
					
						
							|  |  |  |         if ($draft->page->updated_at->timestamp > $draft->updated_at->timestamp) { | 
					
						
							|  |  |  |             $message .= "\n This page has been updated by since that time. It is recommended that you discard this draft."; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $message; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Check if a page is being actively editing. | 
					
						
							|  |  |  |      * Checks for edits since last page updated. | 
					
						
							|  |  |  |      * Passing in a minuted range will check for edits | 
					
						
							|  |  |  |      * within the last x minutes. | 
					
						
							|  |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @param null $minRange | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function isPageEditingActive(Page $page, $minRange = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $draftSearch = $this->activePageEditingQuery($page, $minRange); | 
					
						
							|  |  |  |         return $draftSearch->count() > 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get a notification message concerning the editing activity on | 
					
						
							|  |  |  |      * a particular page. | 
					
						
							|  |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @param null $minRange | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getPageEditingActiveMessage(Page $page, $minRange = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $pageDraftEdits = $this->activePageEditingQuery($page, $minRange)->get(); | 
					
						
							|  |  |  |         $userMessage = $pageDraftEdits->count() > 1 ? $pageDraftEdits->count() . ' users have' : $pageDraftEdits->first()->createdBy->name . ' has'; | 
					
						
							|  |  |  |         $timeMessage = $minRange === null ? 'since the page was last updated' : 'in the last ' . $minRange . ' minutes'; | 
					
						
							|  |  |  |         $message = '%s started editing this page %s. Take care not to overwrite each other\'s updates!'; | 
					
						
							|  |  |  |         return sprintf($message, $userMessage, $timeMessage); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * A query to check for active update drafts on a particular page. | 
					
						
							|  |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @param null $minRange | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function activePageEditingQuery(Page $page, $minRange = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $query = $this->pageRevision->where('type', '=', 'update_draft') | 
					
						
							| 
									
										
										
										
											2016-03-13 22:33:43 +08:00
										 |  |  |             ->where('page_id', '=', $page->id) | 
					
						
							| 
									
										
										
										
											2016-03-12 23:52:19 +08:00
										 |  |  |             ->where('updated_at', '>', $page->updated_at) | 
					
						
							|  |  |  |             ->where('created_by', '!=', auth()->user()->id) | 
					
						
							|  |  |  |             ->with('createdBy'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($minRange !== null) { | 
					
						
							|  |  |  |             $query = $query->where('updated_at', '>=', Carbon::now()->subMinutes($minRange)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $query; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Gets a single revision via it's id. | 
					
						
							|  |  |  |      * @param $id | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getRevisionById($id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->pageRevision->findOrFail($id); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-21 05:05:26 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |      * Checks if a slug exists within a book already. | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |      * @param            $slug | 
					
						
							|  |  |  |      * @param            $bookId | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |      * @param bool|false $currentId | 
					
						
							|  |  |  |      * @return bool | 
					
						
							| 
									
										
										
										
											2015-07-21 05:05:26 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |     public function doesSlugExist($slug, $bookId, $currentId = false) | 
					
						
							| 
									
										
										
										
											2015-07-21 05:05:26 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |         $query = $this->page->where('slug', '=', $slug)->where('book_id', '=', $bookId); | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |         if ($currentId) $query = $query->where('id', '!=', $currentId); | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |         return $query->count() > 0; | 
					
						
							| 
									
										
										
										
											2015-07-22 03:13:29 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-11-22 02:11:46 +08:00
										 |  |  |      * Changes the related book for the specified page. | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |      * Changes the book id of any relations to the page that store the book id. | 
					
						
							| 
									
										
										
										
											2016-03-10 06:32:07 +08:00
										 |  |  |      * @param int $bookId | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |      * @param Page $page | 
					
						
							|  |  |  |      * @return Page | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-11-22 02:11:46 +08:00
										 |  |  |     public function changeBook($bookId, Page $page) | 
					
						
							| 
									
										
										
										
											2015-09-06 21:35:53 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $page->book_id = $bookId; | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |         foreach ($page->activity as $activity) { | 
					
						
							| 
									
										
										
										
											2015-09-06 21:35:53 +08:00
										 |  |  |             $activity->book_id = $bookId; | 
					
						
							|  |  |  |             $activity->save(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-11-22 02:11:46 +08:00
										 |  |  |         $page->slug = $this->findSuitableSlug($page->name, $bookId, $page->id); | 
					
						
							| 
									
										
										
										
											2015-09-06 21:35:53 +08:00
										 |  |  |         $page->save(); | 
					
						
							|  |  |  |         return $page; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-22 03:13:29 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |      * Gets a suitable slug for the resource | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |      * @param            $name | 
					
						
							|  |  |  |      * @param            $bookId | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |      * @param bool|false $currentId | 
					
						
							|  |  |  |      * @return string | 
					
						
							| 
									
										
										
										
											2015-07-22 03:13:29 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |     public function findSuitableSlug($name, $bookId, $currentId = false) | 
					
						
							| 
									
										
										
										
											2015-07-22 03:13:29 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |         $slug = Str::slug($name); | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |         while ($this->doesSlugExist($slug, $bookId, $currentId)) { | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |             $slug .= '-' . substr(md5(rand(1, 500)), 0, 3); | 
					
						
							| 
									
										
										
										
											2015-07-22 03:13:29 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |         return $slug; | 
					
						
							| 
									
										
										
										
											2015-07-21 05:05:26 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Destroy a given page along with its dependencies. | 
					
						
							|  |  |  |      * @param $page | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |     public function destroy(Page $page) | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         Activity::removeEntity($page); | 
					
						
							|  |  |  |         $page->views()->delete(); | 
					
						
							| 
									
										
										
										
											2016-05-14 04:20:21 +08:00
										 |  |  |         $page->tags()->delete(); | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |         $page->revisions()->delete(); | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $page->permissions()->delete(); | 
					
						
							|  |  |  |         $this->permissionService->deleteJointPermissionsForEntity($page); | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |         $page->delete(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-21 02:51:01 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the latest pages added to the system. | 
					
						
							|  |  |  |      * @param $count | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getRecentlyCreatedPaginated($count = 20) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         return $this->pageQuery()->orderBy('created_at', 'desc')->paginate($count); | 
					
						
							| 
									
										
										
										
											2016-02-21 02:51:01 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the latest pages added to the system. | 
					
						
							|  |  |  |      * @param $count | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getRecentlyUpdatedPaginated($count = 20) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         return $this->pageQuery()->orderBy('updated_at', 'desc')->paginate($count); | 
					
						
							| 
									
										
										
										
											2016-02-21 02:51:01 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-21 00:31:21 +08:00
										 |  |  | } |