| 
									
										
										
										
											2016-12-05 00:51:39 +08:00
										 |  |  | <?php namespace BookStack\Http\Controllers; | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-02 00:57:47 +08:00
										 |  |  | use BookStack\Repos\EntityRepo; | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  | use BookStack\Services\SearchService; | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  | use BookStack\Services\ViewService; | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  | use Illuminate\Http\Request; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SearchController extends Controller | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2017-01-02 00:57:47 +08:00
										 |  |  |     protected $entityRepo; | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  |     protected $viewService; | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  |     protected $searchService; | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * SearchController constructor. | 
					
						
							| 
									
										
										
										
											2017-01-02 00:57:47 +08:00
										 |  |  |      * @param EntityRepo $entityRepo | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  |      * @param ViewService $viewService | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  |      * @param SearchService $searchService | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  |     public function __construct(EntityRepo $entityRepo, ViewService $viewService, SearchService $searchService) | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-01-02 00:57:47 +08:00
										 |  |  |         $this->entityRepo = $entityRepo; | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  |         $this->viewService = $viewService; | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  |         $this->searchService = $searchService; | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |         parent::__construct(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Searches all entities. | 
					
						
							|  |  |  |      * @param Request $request | 
					
						
							|  |  |  |      * @return \Illuminate\View\View | 
					
						
							|  |  |  |      * @internal param string $searchTerm | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2017-04-10 03:59:57 +08:00
										 |  |  |     public function search(Request $request) | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $searchTerm = $request->get('term'); | 
					
						
							| 
									
										
										
										
											2016-12-05 00:51:39 +08:00
										 |  |  |         $this->setPageTitle(trans('entities.search_for_term', ['term' => $searchTerm])); | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-19 23:56:06 +08:00
										 |  |  |         $page = intval($request->get('page', '0')) ?: 1; | 
					
						
							| 
									
										
										
										
											2017-04-15 22:04:30 +08:00
										 |  |  |         $nextPageLink = baseUrl('/search?term=' . urlencode($searchTerm) . '&page=' . ($page+1)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $results = $this->searchService->searchEntities($searchTerm, 'all', $page, 20); | 
					
						
							| 
									
										
										
										
											2017-03-19 20:48:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |         return view('search/all', [ | 
					
						
							| 
									
										
										
										
											2017-04-15 22:04:30 +08:00
										 |  |  |             'entities'   => $results['results'], | 
					
						
							|  |  |  |             'totalResults' => $results['total'], | 
					
						
							|  |  |  |             'searchTerm' => $searchTerm, | 
					
						
							| 
									
										
										
										
											2018-03-25 02:46:31 +08:00
										 |  |  |             'hasNextPage' => $results['has_more'], | 
					
						
							| 
									
										
										
										
											2017-04-15 22:04:30 +08:00
										 |  |  |             'nextPageLink' => $nextPageLink | 
					
						
							| 
									
										
										
										
											2016-02-21 20:53:58 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-01 22:35:11 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Searches all entities within a book. | 
					
						
							|  |  |  |      * @param Request $request | 
					
						
							|  |  |  |      * @param integer $bookId | 
					
						
							|  |  |  |      * @return \Illuminate\View\View | 
					
						
							|  |  |  |      * @internal param string $searchTerm | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function searchBook(Request $request, $bookId) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-04-16 02:16:07 +08:00
										 |  |  |         $term = $request->get('term', ''); | 
					
						
							|  |  |  |         $results = $this->searchService->searchBook($bookId, $term); | 
					
						
							|  |  |  |         return view('partials/entity-list', ['entities' => $results]); | 
					
						
							| 
									
										
										
										
											2015-09-01 22:35:11 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-16 02:16:07 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Searches all entities within a chapter. | 
					
						
							|  |  |  |      * @param Request $request | 
					
						
							|  |  |  |      * @param integer $chapterId | 
					
						
							|  |  |  |      * @return \Illuminate\View\View | 
					
						
							|  |  |  |      * @internal param string $searchTerm | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function searchChapter(Request $request, $chapterId) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $term = $request->get('term', ''); | 
					
						
							|  |  |  |         $results = $this->searchService->searchChapter($chapterId, $term); | 
					
						
							|  |  |  |         return view('partials/entity-list', ['entities' => $results]); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Search for a list of entities and return a partial HTML response of matching entities. | 
					
						
							|  |  |  |      * Returns the most popular entities if no search is provided. | 
					
						
							|  |  |  |      * @param Request $request | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function searchEntitiesAjax(Request $request) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-11-19 23:56:06 +08:00
										 |  |  |         $entityTypes = $request->filled('types') ? collect(explode(',', $request->get('types'))) : collect(['page', 'chapter', 'book']); | 
					
						
							|  |  |  |         $searchTerm =  $request->get('term', false); | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |         $permission = $request->get('permission', 'view'); | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // Search for entities otherwise show most popular
 | 
					
						
							|  |  |  |         if ($searchTerm !== false) { | 
					
						
							| 
									
										
										
										
											2017-04-16 02:16:07 +08:00
										 |  |  |             $searchTerm .= ' {type:'. implode('|', $entityTypes->toArray()) .'}'; | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |             $entities = $this->searchService->searchEntities($searchTerm, 'all', 1, 20, $permission)['results']; | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  |         } else { | 
					
						
							|  |  |  |             $entityNames = $entityTypes->map(function ($type) { | 
					
						
							|  |  |  |                 return 'BookStack\\' . ucfirst($type); | 
					
						
							|  |  |  |             })->toArray(); | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |             $entities = $this->viewService->getPopular(20, 0, $entityNames, $permission); | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-03 16:58:45 +08:00
										 |  |  |         return view('search/entity-ajax-list', ['entities' => $entities]); | 
					
						
							| 
									
										
										
										
											2016-06-12 19:14:14 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-09-01 03:11:44 +08:00
										 |  |  | } |