| 
									
										
										
										
											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; | 
					
						
							|  |  |  | use BookStack\Chapter; | 
					
						
							|  |  |  | use Illuminate\Http\Request; | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  | use Illuminate\Support\Facades\Auth; | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  | use Illuminate\Support\Facades\Log; | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | class PageRepo | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     protected $page; | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |     protected $pageRevision; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * PageRepo constructor. | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |      * @param Page         $page | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |      * @param PageRevision $pageRevision | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |     public function __construct(Page $page, PageRevision $pageRevision) | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->page = $page; | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         $this->pageRevision = $pageRevision; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Check if a page id exists. | 
					
						
							|  |  |  |      * @param $id | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  |     public function idExists($id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->page->where('page_id', '=', $id)->count() > 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get a page via a specific ID. | 
					
						
							|  |  |  |      * @param $id | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     public function getById($id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->page->findOrFail($id); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get all pages. | 
					
						
							|  |  |  |      * @return \Illuminate\Database\Eloquent\Collection|static[] | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     public function getAll() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->page->all(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get a page identified by the given slug. | 
					
						
							|  |  |  |      * @param $slug | 
					
						
							|  |  |  |      * @param $bookId | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-16 05:55:49 +08:00
										 |  |  |     public function getBySlug($slug, $bookId) | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-12-29 01:19:23 +08:00
										 |  |  |         $page = $this->page->where('slug', '=', $slug)->where('book_id', '=', $bookId)->first(); | 
					
						
							|  |  |  |         if ($page === null) abort(404); | 
					
						
							|  |  |  |         return $page; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  |      * @param Book  $book | 
					
						
							|  |  |  |      * @param int   $chapterId | 
					
						
							|  |  |  |      * @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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Formats a page's html to be tagged correctly | 
					
						
							|  |  |  |      * within the system. | 
					
						
							|  |  |  |      * @param string $htmlText | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function formatHtml($htmlText) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-12-28 23:58:13 +08:00
										 |  |  |         if($htmlText == '') return $htmlText; | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |         libxml_use_internal_errors(true); | 
					
						
							|  |  |  |         $doc = new \DOMDocument(); | 
					
						
							|  |  |  |         $doc->loadHTML($htmlText); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $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
 | 
					
						
							|  |  |  |         $lastId = false; | 
					
						
							|  |  |  |         $idArray = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($childNodes as $index => $childNode) { | 
					
						
							|  |  |  |             /** @var \DOMElement $childNode */ | 
					
						
							|  |  |  |             if (get_class($childNode) !== 'DOMElement') continue; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // Overwrite id if not a bookstack custom id
 | 
					
						
							|  |  |  |             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
 | 
					
						
							|  |  |  |             do { | 
					
						
							|  |  |  |                 $id = 'bkmrk-' . substr(uniqid(), -5); | 
					
						
							|  |  |  |             } while ($id == $lastId); | 
					
						
							|  |  |  |             $lastId = $id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $childNode->setAttribute('id', $id); | 
					
						
							|  |  |  |             $idArray[] = $id; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // 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. | 
					
						
							|  |  |  |      * @param string      $term | 
					
						
							|  |  |  |      * @param array $whereTerms | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-09-01 22:35:11 +08:00
										 |  |  |     public function getBySearch($term, $whereTerms = []) | 
					
						
							| 
									
										
										
										
											2015-07-17 02:53:24 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-12-29 23:37:13 +08:00
										 |  |  |         $terms = explode(' ', $term); | 
					
						
							| 
									
										
										
										
											2015-09-01 22:35:11 +08:00
										 |  |  |         $pages = $this->page->fullTextSearch(['name', 'text'], $terms, $whereTerms); | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |         $pages = $this->page->where('html', 'like', '%' . $imageString . '%')->get(); | 
					
						
							|  |  |  |         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. | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |      * @param Page   $page | 
					
						
							|  |  |  |      * @param int    $book_id | 
					
						
							|  |  |  |      * @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); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Update with new details
 | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |         $page->fill($input); | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         $page->slug = $this->findSuitableSlug($page->name, $book_id, $page->id); | 
					
						
							| 
									
										
										
										
											2015-10-11 01:57:52 +08:00
										 |  |  |         $page->html = $this->formatHtml($input['html']); | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         $page->text = strip_tags($page->html); | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |         $page->updated_by = auth()->user()->id; | 
					
						
							| 
									
										
										
										
											2015-08-09 19:06:52 +08:00
										 |  |  |         $page->save(); | 
					
						
							| 
									
										
										
										
											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()); | 
					
						
							|  |  |  |         $revision->page_id = $page->id; | 
					
						
							| 
									
										
										
										
											2015-10-19 02:40:33 +08:00
										 |  |  |         $revision->created_by = auth()->user()->id; | 
					
						
							|  |  |  |         $revision->created_at = $page->updated_at; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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. | 
					
						
							|  |  |  |      * @param int  $bookId | 
					
						
							|  |  |  |      * @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 | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function destroy($page) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         Activity::removeEntity($page); | 
					
						
							|  |  |  |         $page->views()->delete(); | 
					
						
							|  |  |  |         $page->revisions()->delete(); | 
					
						
							|  |  |  |         $page->delete(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-31 05:27:35 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  | } |