| 
									
										
										
										
											2015-09-11 02:31:09 +08:00
										 |  |  | <?php namespace BookStack\Repos; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-09 17:26:54 +08:00
										 |  |  | use Illuminate\Support\Str; | 
					
						
							| 
									
										
										
										
											2015-09-11 02:31:09 +08:00
										 |  |  | use BookStack\Book; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class BookRepo | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected $book; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     protected $pageRepo; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * BookRepo constructor. | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |      * @param Book $book | 
					
						
							|  |  |  |      * @param PageRepo $pageRepo | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |     public function __construct(Book $book, PageRepo $pageRepo) | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->book = $book; | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |         $this->pageRepo = $pageRepo; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function getById($id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->book->findOrFail($id); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function getAll() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->book->all(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function countBySlug($slug) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return $this->book->where('slug', '=', $slug)->count(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-07-31 06:18:48 +08:00
										 |  |  |         foreach($book->pages as $page) { | 
					
						
							| 
									
										
										
										
											2015-09-05 00:50:52 +08:00
										 |  |  |             \Activity::removeEntity($page); | 
					
						
							| 
									
										
										
										
											2015-07-31 06:18:48 +08:00
										 |  |  |             $page->delete(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         foreach($book->chapters as $chapter) { | 
					
						
							| 
									
										
										
										
											2015-09-05 00:50:52 +08:00
										 |  |  |             \Activity::removeEntity($chapter); | 
					
						
							| 
									
										
										
										
											2015-07-31 06:18:48 +08:00
										 |  |  |             $chapter->delete(); | 
					
						
							| 
									
										
										
										
											2015-07-13 04:31:15 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |         $book->delete(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |     public function getNewPriority($book) | 
					
						
							| 
									
										
										
										
											2015-07-21 05:05:26 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-07-29 03:57:13 +08:00
										 |  |  |         $lastElem = $book->children()->pop(); | 
					
						
							|  |  |  |         return $lastElem ? $lastElem->priority + 1 : 0; | 
					
						
							| 
									
										
										
										
											2015-07-21 05:05:26 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-09 17:26:54 +08:00
										 |  |  |     public function doesSlugExist($slug, $currentId = false) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $query = $this->book->where('slug', '=', $slug); | 
					
						
							|  |  |  |         if($currentId) { | 
					
						
							|  |  |  |             $query = $query->where('id', '!=', $currentId); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $query->count() > 0; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public function findSuitableSlug($name, $currentId = false) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-09-30 04:25:03 +08:00
										 |  |  |         $originalSlug = Str::slug($name); | 
					
						
							|  |  |  |         $slug = $originalSlug; | 
					
						
							|  |  |  |         $count = 2; | 
					
						
							| 
									
										
										
										
											2015-08-09 17:26:54 +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-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
										 |  |  | } |