| 
									
										
										
										
											2015-09-11 02:31:09 +08:00
										 |  |  | <?php namespace BookStack\Repos; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  | use Alpha\B; | 
					
						
							| 
									
										
										
										
											2016-03-06 03:00:26 +08:00
										 |  |  | use BookStack\Exceptions\NotFoundException; | 
					
						
							| 
									
										
										
										
											2015-08-09 17:26:54 +08:00
										 |  |  | use Illuminate\Support\Str; | 
					
						
							| 
									
										
										
										
											2015-09-11 02:31:09 +08:00
										 |  |  | use BookStack\Book; | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  | use Views; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 03:00:26 +08:00
										 |  |  | class BookRepo extends EntityRepo | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     protected $pageRepo; | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     protected $chapterRepo; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * BookRepo constructor. | 
					
						
							| 
									
										
										
										
											2016-02-23 05:28:20 +08:00
										 |  |  |      * @param PageRepo $pageRepo | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |      * @param ChapterRepo $chapterRepo | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-03-06 03:00:26 +08:00
										 |  |  |     public function __construct(PageRepo $pageRepo, ChapterRepo $chapterRepo) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |         $this->pageRepo = $pageRepo; | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |         $this->chapterRepo = $chapterRepo; | 
					
						
							| 
									
										
										
										
											2016-03-06 03:00:26 +08:00
										 |  |  |         parent::__construct(); | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Base query for getting books. | 
					
						
							|  |  |  |      * Takes into account any restrictions. | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     private function bookQuery() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         return $this->permissionService->enforceBookRestrictions($this->book, 'view'); | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the book that has the given id. | 
					
						
							|  |  |  |      * @param $id | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     public function getById($id) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         return $this->bookQuery()->findOrFail($id); | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get all books, Limited by count. | 
					
						
							|  |  |  |      * @param int $count | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-11-10 04:39:06 +08:00
										 |  |  |     public function getAll($count = 10) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         $bookQuery = $this->bookQuery()->orderBy('name', 'asc'); | 
					
						
							| 
									
										
										
										
											2016-02-23 05:28:20 +08:00
										 |  |  |         if (!$count) return $bookQuery->get(); | 
					
						
							|  |  |  |         return $bookQuery->take($count)->get(); | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-10 03:46:04 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |      * Get all books paginated. | 
					
						
							| 
									
										
										
										
											2015-11-10 03:46:04 +08:00
										 |  |  |      * @param int $count | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getAllPaginated($count = 10) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         return $this->bookQuery() | 
					
						
							|  |  |  |             ->orderBy('name', 'asc')->paginate($count); | 
					
						
							| 
									
										
										
										
											2015-11-10 03:46:04 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the latest books. | 
					
						
							|  |  |  |      * @param int $count | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getLatest($count = 10) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         return $this->bookQuery()->orderBy('created_at', 'desc')->take($count)->get(); | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Gets the most recently viewed for a user. | 
					
						
							|  |  |  |      * @param int $count | 
					
						
							|  |  |  |      * @param int $page | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     public function getRecentlyViewed($count = 10, $page = 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return Views::getUserRecentlyViewed($count, $page, $this->book); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-08 07:00:34 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Gets the most viewed books. | 
					
						
							|  |  |  |      * @param int $count | 
					
						
							|  |  |  |      * @param int $page | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-12-03 04:22:41 +08:00
										 |  |  |     public function getPopular($count = 10, $page = 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return Views::getPopular($count, $page, $this->book); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get a book by slug | 
					
						
							|  |  |  |      * @param $slug | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     public function getBySlug($slug) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         $book = $this->bookQuery()->where('slug', '=', $slug)->first(); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |         if ($book === null) throw new NotFoundException('Book not found'); | 
					
						
							| 
									
										
										
										
											2015-12-29 01:19:23 +08:00
										 |  |  |         return $book; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 21:35:53 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Checks if a book exists. | 
					
						
							|  |  |  |      * @param $id | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function exists($id) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         return $this->bookQuery()->where('id', '=', $id)->exists(); | 
					
						
							| 
									
										
										
										
											2015-09-06 21:35:53 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-03 01:26:33 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get a new book instance from request input. | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |      * @param array $input | 
					
						
							|  |  |  |      * @return Book | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function createFromInput($input) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $book = $this->book->newInstance($input); | 
					
						
							|  |  |  |         $book->slug = $this->findSuitableSlug($book->name); | 
					
						
							|  |  |  |         $book->created_by = auth()->user()->id; | 
					
						
							|  |  |  |         $book->updated_by = auth()->user()->id; | 
					
						
							|  |  |  |         $book->save(); | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $this->permissionService->buildJointPermissionsForEntity($book); | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |         return $book; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Update the given book from user input. | 
					
						
							|  |  |  |      * @param Book $book | 
					
						
							| 
									
										
										
										
											2015-09-03 01:26:33 +08:00
										 |  |  |      * @param $input | 
					
						
							|  |  |  |      * @return Book | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |     public function updateFromInput(Book $book, $input) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |         $book->fill($input); | 
					
						
							|  |  |  |         $book->slug = $this->findSuitableSlug($book->name, $book->id); | 
					
						
							|  |  |  |         $book->updated_by = auth()->user()->id; | 
					
						
							|  |  |  |         $book->save(); | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $this->permissionService->buildJointPermissionsForEntity($book); | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |         return $book; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |      * Destroy the given book. | 
					
						
							|  |  |  |      * @param Book $book | 
					
						
							|  |  |  |      * @throws \Exception | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |     public function destroy(Book $book) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-11-10 03:46:04 +08:00
										 |  |  |         foreach ($book->pages as $page) { | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |             $this->pageRepo->destroy($page); | 
					
						
							| 
									
										
										
										
											2015-07-31 06:18:48 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-11-10 03:46:04 +08:00
										 |  |  |         foreach ($book->chapters as $chapter) { | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |             $this->chapterRepo->destroy($chapter); | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |         $book->views()->delete(); | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $book->permissions()->delete(); | 
					
						
							|  |  |  |         $this->permissionService->deleteJointPermissionsForEntity($book); | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |         $book->delete(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |      * Alias method to update the book jointPermissions in the PermissionService. | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |      * @param Book $book | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function updateBookPermissions(Book $book) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $this->permissionService->buildJointPermissionsForEntity($book); | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the next child element priority. | 
					
						
							|  |  |  |      * @param Book $book | 
					
						
							|  |  |  |      * @return int | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |     public function getNewPriority($book) | 
					
						
							| 
									
										
										
										
											2015-07-21 05:05:26 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-11-30 01:33:25 +08:00
										 |  |  |         $lastElem = $this->getChildren($book)->pop(); | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |         return $lastElem ? $lastElem->priority + 1 : 0; | 
					
						
							| 
									
										
										
										
											2015-07-21 05:05:26 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-02-23 05:28:20 +08:00
										 |  |  |      * @param string $slug | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |      * @param bool|false $currentId | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-08-09 17:26:54 +08:00
										 |  |  |     public function doesSlugExist($slug, $currentId = false) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $query = $this->book->where('slug', '=', $slug); | 
					
						
							| 
									
										
										
										
											2015-11-10 03:46:04 +08:00
										 |  |  |         if ($currentId) { | 
					
						
							| 
									
										
										
										
											2015-08-09 17:26:54 +08:00
										 |  |  |             $query = $query->where('id', '!=', $currentId); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $query->count() > 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Provides a suitable slug for the given book name. | 
					
						
							|  |  |  |      * Ensures the returned slug is unique in the system. | 
					
						
							| 
									
										
										
										
											2016-02-23 05:28:20 +08:00
										 |  |  |      * @param string $name | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |      * @param bool|false $currentId | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-08-09 17:26:54 +08:00
										 |  |  |     public function findSuitableSlug($name, $currentId = false) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-08-13 20:53:04 +08:00
										 |  |  |         $slug = Str::slug($name); | 
					
						
							|  |  |  |         if ($slug === "") $slug = substr(md5(rand(1, 500)), 0, 5); | 
					
						
							| 
									
										
										
										
											2015-11-10 03:46:04 +08:00
										 |  |  |         while ($this->doesSlugExist($slug, $currentId)) { | 
					
						
							| 
									
										
										
										
											2016-08-13 20:53:04 +08:00
										 |  |  |             $slug .= '-' . substr(md5(rand(1, 500)), 0, 3); | 
					
						
							| 
									
										
										
										
											2015-08-09 17:26:54 +08:00
										 |  |  |         } | 
					
						
							|  |  |  |         return $slug; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 07:45:04 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get all child objects of a book. | 
					
						
							|  |  |  |      * Returns a sorted collection of Pages and Chapters. | 
					
						
							| 
									
										
										
										
											2016-08-13 20:53:04 +08:00
										 |  |  |      * Loads the book slug onto child elements to prevent access database access for getting the slug. | 
					
						
							| 
									
										
										
										
											2015-11-27 07:45:04 +08:00
										 |  |  |      * @param Book $book | 
					
						
							| 
									
										
										
										
											2016-04-16 02:51:27 +08:00
										 |  |  |      * @param bool $filterDrafts | 
					
						
							| 
									
										
										
										
											2015-11-27 07:45:04 +08:00
										 |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-04-16 02:51:27 +08:00
										 |  |  |     public function getChildren(Book $book, $filterDrafts = false) | 
					
						
							| 
									
										
										
										
											2015-11-27 07:45:04 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         $pageQuery = $book->pages()->where('chapter_id', '=', 0); | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $pageQuery = $this->permissionService->enforcePageRestrictions($pageQuery, 'view'); | 
					
						
							| 
									
										
										
										
											2016-04-16 02:51:27 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if ($filterDrafts) { | 
					
						
							|  |  |  |             $pageQuery = $pageQuery->where('draft', '=', false); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         $pages = $pageQuery->get(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-13 20:53:04 +08:00
										 |  |  |         $chapterQuery = $book->chapters()->with(['pages' => function ($query) use ($filterDrafts) { | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |             $this->permissionService->enforcePageRestrictions($query, 'view'); | 
					
						
							| 
									
										
										
										
											2016-04-16 02:51:27 +08:00
										 |  |  |             if ($filterDrafts) $query->where('draft', '=', false); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |         }]); | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $chapterQuery = $this->permissionService->enforceChapterRestrictions($chapterQuery, 'view'); | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |         $chapters = $chapterQuery->get(); | 
					
						
							| 
									
										
										
										
											2016-07-03 17:31:20 +08:00
										 |  |  |         $children = $pages->values(); | 
					
						
							|  |  |  |         foreach ($chapters as $chapter) { | 
					
						
							|  |  |  |             $children->push($chapter); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-11-27 07:45:04 +08:00
										 |  |  |         $bookSlug = $book->slug; | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 07:45:04 +08:00
										 |  |  |         $children->each(function ($child) use ($bookSlug) { | 
					
						
							|  |  |  |             $child->setAttribute('bookSlug', $bookSlug); | 
					
						
							|  |  |  |             if ($child->isA('chapter')) { | 
					
						
							|  |  |  |                 $child->pages->each(function ($page) use ($bookSlug) { | 
					
						
							|  |  |  |                     $page->setAttribute('bookSlug', $bookSlug); | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2016-08-13 20:53:04 +08:00
										 |  |  |                 $child->pages = $child->pages->sortBy(function ($child, $key) { | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |                     $score = $child->priority; | 
					
						
							|  |  |  |                     if ($child->draft) $score -= 100; | 
					
						
							|  |  |  |                     return $score; | 
					
						
							|  |  |  |                 }); | 
					
						
							| 
									
										
										
										
											2015-11-27 07:45:04 +08:00
										 |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Sort items with drafts first then by priority.
 | 
					
						
							| 
									
										
										
										
											2016-08-13 20:53:04 +08:00
										 |  |  |         return $children->sortBy(function ($child, $key) { | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |             $score = $child->priority; | 
					
						
							|  |  |  |             if ($child->isA('page') && $child->draft) $score -= 100; | 
					
						
							|  |  |  |             return $score; | 
					
						
							|  |  |  |         }); | 
					
						
							| 
									
										
										
										
											2015-11-27 07:45:04 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get books by search term. | 
					
						
							|  |  |  |      * @param $term | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |      * @param int $count | 
					
						
							|  |  |  |      * @param array $paginationAppends | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |     public function getBySearch($term, $count = 20, $paginationAppends = []) | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-03-06 03:00:26 +08:00
										 |  |  |         $terms = $this->prepareSearchTerms($term); | 
					
						
							| 
									
										
										
										
											2016-05-15 20:41:18 +08:00
										 |  |  |         $bookQuery = $this->permissionService->enforceBookRestrictions($this->book->fullTextSearchQuery(['name', 'description'], $terms)); | 
					
						
							|  |  |  |         $bookQuery = $this->addAdvancedSearchQueries($bookQuery, $term); | 
					
						
							|  |  |  |         $books = $bookQuery->paginate($count)->appends($paginationAppends); | 
					
						
							| 
									
										
										
										
											2015-12-29 23:37:13 +08:00
										 |  |  |         $words = join('|', explode(' ', preg_quote(trim($term), '/'))); | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |         foreach ($books as $book) { | 
					
						
							|  |  |  |             //highlight
 | 
					
						
							|  |  |  |             $result = preg_replace('#' . $words . '#iu', "<span class=\"highlight\">\$0</span>", $book->getExcerpt(100)); | 
					
						
							|  |  |  |             $book->searchSnippet = $result; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $books; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | } |