| 
									
										
										
										
											2015-09-11 02:31:09 +08:00
										 |  |  | <?php namespace BookStack\Repos; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  | use Activity; | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  | class BookRepo | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected $book; | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |      * @param Book        $book | 
					
						
							|  |  |  |      * @param PageRepo    $pageRepo | 
					
						
							|  |  |  |      * @param ChapterRepo $chapterRepo | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |     public function __construct(Book $book, PageRepo $pageRepo, ChapterRepo $chapterRepo) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->book = $book; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |         $this->pageRepo = $pageRepo; | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  |         $this->chapterRepo = $chapterRepo; | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->book->findOrFail($id); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-11-10 04:39:06 +08:00
										 |  |  |         return $this->book->orderBy('name', 'asc')->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) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->book->orderBy('name', 'asc')->paginate($count); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 02:05:03 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get the latest books. | 
					
						
							|  |  |  |      * @param int $count | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getLatest($count = 10) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->book->orderBy('created_at', 'desc')->take($count)->get(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * 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); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get a book by slug | 
					
						
							|  |  |  |      * @param $slug | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     public function getBySlug($slug) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->book->where('slug', '=', $slug)->first(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-06 21:35:53 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Checks if a book exists. | 
					
						
							|  |  |  |      * @param $id | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function exists($id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->book->where('id', '=', $id)->exists(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-03 01:26:33 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get a new book instance from request input. | 
					
						
							|  |  |  |      * @param $input | 
					
						
							|  |  |  |      * @return Book | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     public function newFromInput($input) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->book->fill($input); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Count the amount of books that have a specific slug. | 
					
						
							|  |  |  |      * @param $slug | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     public function countBySlug($slug) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->book->where('slug', '=', $slug)->count(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Destroy a book identified by the given slug. | 
					
						
							|  |  |  |      * @param $bookSlug | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |     public function destroyBySlug($bookSlug) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |         $book = $this->getBySlug($bookSlug); | 
					
						
							| 
									
										
										
										
											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(); | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |         $book->delete(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     /** | 
					
						
							|  |  |  |      * @param string     $slug | 
					
						
							|  |  |  |      * @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. | 
					
						
							|  |  |  |      * @param string     $name | 
					
						
							|  |  |  |      * @param bool|false $currentId | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-08-09 17:26:54 +08:00
										 |  |  |     public function findSuitableSlug($name, $currentId = false) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-09-30 04:25:03 +08:00
										 |  |  |         $originalSlug = Str::slug($name); | 
					
						
							|  |  |  |         $slug = $originalSlug; | 
					
						
							|  |  |  |         $count = 2; | 
					
						
							| 
									
										
										
										
											2015-11-10 03:46:04 +08:00
										 |  |  |         while ($this->doesSlugExist($slug, $currentId)) { | 
					
						
							| 
									
										
										
										
											2015-09-30 04:25:03 +08:00
										 |  |  |             $slug = $originalSlug . '-' . $count; | 
					
						
							|  |  |  |             $count++; | 
					
						
							| 
									
										
										
										
											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. | 
					
						
							|  |  |  |      * Loads the bookslug onto child elements to prevent access database access for getting the slug. | 
					
						
							|  |  |  |      * @param Book $book | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getChildren(Book $book) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $pages = $book->pages()->where('chapter_id', '=', 0)->get(); | 
					
						
							|  |  |  |         $chapters = $book->chapters()->with('pages')->get(); | 
					
						
							|  |  |  |         $children = $pages->merge($chapters); | 
					
						
							|  |  |  |         $bookSlug = $book->slug; | 
					
						
							|  |  |  |         $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); | 
					
						
							|  |  |  |                 }); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |         return $children->sortBy('priority'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get books by search term. | 
					
						
							|  |  |  |      * @param $term | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |     public function getBySearch($term) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $terms = explode(' ', preg_quote(trim($term))); | 
					
						
							|  |  |  |         $books = $this->book->fullTextSearch(['name', 'description'], $terms); | 
					
						
							|  |  |  |         $words = join('|', $terms); | 
					
						
							|  |  |  |         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
										 |  |  | } |