| 
									
										
										
										
											2021-11-15 00:28:01 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | namespace BookStack\Search; | 
					
						
							| 
									
										
										
										
											2021-11-15 00:28:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 22:05:57 +08:00
										 |  |  | use BookStack\Api\ApiEntityListFormatter; | 
					
						
							| 
									
										
										
										
											2021-11-15 00:28:01 +08:00
										 |  |  | use BookStack\Entities\Models\Entity; | 
					
						
							| 
									
										
										
										
											2023-05-19 03:53:39 +08:00
										 |  |  | use BookStack\Http\ApiController; | 
					
						
							| 
									
										
										
										
											2021-11-15 00:28:01 +08:00
										 |  |  | use Illuminate\Http\Request; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class SearchApiController extends ApiController | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     protected $rules = [ | 
					
						
							|  |  |  |         'all' => [ | 
					
						
							| 
									
										
										
										
											2024-10-21 05:12:49 +08:00
										 |  |  |             'query' => ['required'], | 
					
						
							| 
									
										
										
										
											2024-12-03 21:47:45 +08:00
										 |  |  |             'page'  => ['integer', 'min:1'], | 
					
						
							| 
									
										
										
										
											2024-10-21 05:12:49 +08:00
										 |  |  |             'count' => ['integer', 'min:1', 'max:100'], | 
					
						
							| 
									
										
										
										
											2021-11-15 00:28:01 +08:00
										 |  |  |         ], | 
					
						
							|  |  |  |     ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-03 21:47:45 +08:00
										 |  |  |     public function __construct( | 
					
						
							|  |  |  |         protected SearchRunner $searchRunner, | 
					
						
							|  |  |  |         protected SearchResultsFormatter $resultsFormatter | 
					
						
							|  |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2021-11-15 00:28:01 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Run a search query against all main content types (shelves, books, chapters & pages) | 
					
						
							|  |  |  |      * in the system. Takes the same input as the main search bar within the BookStack | 
					
						
							|  |  |  |      * interface as a 'query' parameter. See https://www.bookstackapp.com/docs/user/searching/ | 
					
						
							|  |  |  |      * for a full list of search term options. Results contain a 'type' property to distinguish | 
					
						
							|  |  |  |      * between: bookshelf, book, chapter & page. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * The paging parameters and response format emulates a standard listing endpoint | 
					
						
							|  |  |  |      * but standard sorting and filtering cannot be done on this endpoint. If a count value | 
					
						
							|  |  |  |      * is provided this will only be taken as a suggestion. The results in the response | 
					
						
							|  |  |  |      * may currently be up to 4x this value. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function all(Request $request) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->validate($request, $this->rules['all']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $options = SearchOptions::fromString($request->get('query') ?? ''); | 
					
						
							|  |  |  |         $page = intval($request->get('page', '0')) ?: 1; | 
					
						
							|  |  |  |         $count = min(intval($request->get('count', '0')) ?: 20, 100); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $results = $this->searchRunner->searchEntities($options, 'all', $page, $count); | 
					
						
							| 
									
										
										
										
											2021-12-07 04:42:04 +08:00
										 |  |  |         $this->resultsFormatter->format($results['results']->all(), $options); | 
					
						
							| 
									
										
										
										
											2021-11-15 00:28:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-28 01:20:20 +08:00
										 |  |  |         $data = (new ApiEntityListFormatter($results['results']->all())) | 
					
						
							| 
									
										
										
										
											2024-12-03 21:47:45 +08:00
										 |  |  |             ->withType()->withTags()->withParents() | 
					
						
							| 
									
										
										
										
											2024-10-28 01:20:20 +08:00
										 |  |  |             ->withField('preview_html', function (Entity $entity) { | 
					
						
							|  |  |  |                 return [ | 
					
						
							|  |  |  |                     'name' => (string) $entity->getAttribute('preview_name'), | 
					
						
							|  |  |  |                     'content' => (string) $entity->getAttribute('preview_content'), | 
					
						
							|  |  |  |                 ]; | 
					
						
							|  |  |  |             })->format(); | 
					
						
							| 
									
										
										
										
											2021-11-15 00:28:01 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return response()->json([ | 
					
						
							| 
									
										
										
										
											2024-10-28 01:20:20 +08:00
										 |  |  |             'data' => $data, | 
					
						
							| 
									
										
										
										
											2021-11-15 00:28:01 +08:00
										 |  |  |             'total' => $results['total'], | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |