| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-19 03:53:39 +08:00
										 |  |  | namespace BookStack\App; | 
					
						
							| 
									
										
										
										
											2015-08-17 03:11:21 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Activity\ActivityQueries; | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | use BookStack\Entities\Models\Page; | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  | use BookStack\Entities\Queries\EntityQueries; | 
					
						
							| 
									
										
										
										
											2024-02-09 00:39:59 +08:00
										 |  |  | use BookStack\Entities\Queries\QueryRecentlyViewed; | 
					
						
							|  |  |  | use BookStack\Entities\Queries\QueryTopFavourites; | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | use BookStack\Entities\Tools\PageContent; | 
					
						
							| 
									
										
										
										
											2023-05-19 03:53:39 +08:00
										 |  |  | use BookStack\Http\Controller; | 
					
						
							| 
									
										
										
										
											2022-11-01 22:53:36 +08:00
										 |  |  | use BookStack\Util\SimpleListOptions; | 
					
						
							|  |  |  | use Illuminate\Http\Request; | 
					
						
							| 
									
										
										
										
											2015-08-17 03:11:21 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class HomeController extends Controller | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  |     public function __construct( | 
					
						
							|  |  |  |         protected EntityQueries $queries, | 
					
						
							|  |  |  |     ) { | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 03:11:21 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  |      * Display the homepage. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2024-02-09 00:39:59 +08:00
										 |  |  |     public function index( | 
					
						
							|  |  |  |         Request $request, | 
					
						
							|  |  |  |         ActivityQueries $activities, | 
					
						
							|  |  |  |         QueryRecentlyViewed $recentlyViewed, | 
					
						
							|  |  |  |         QueryTopFavourites $topFavourites, | 
					
						
							|  |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2021-12-12 01:29:33 +08:00
										 |  |  |         $activity = $activities->latest(10); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $draftPages = []; | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         if ($this->isSignedIn()) { | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  |             $draftPages = $this->queries->pages->currentUserDraftsForList() | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  |                 ->orderBy('updated_at', 'desc') | 
					
						
							|  |  |  |                 ->with('book') | 
					
						
							|  |  |  |                 ->take(6) | 
					
						
							|  |  |  |                 ->get(); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-13 20:04:08 +08:00
										 |  |  |         $recentFactor = count($draftPages) > 0 ? 0.5 : 1; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $recents = $this->isSignedIn() ? | 
					
						
							| 
									
										
										
										
											2024-02-09 00:39:59 +08:00
										 |  |  |             $recentlyViewed->run(12 * $recentFactor, 1) | 
					
						
							| 
									
										
										
										
											2024-02-08 00:37:36 +08:00
										 |  |  |             : $this->queries->books->visibleForList()->orderBy('created_at', 'desc')->take(12 * $recentFactor)->get(); | 
					
						
							| 
									
										
										
										
											2024-02-09 00:39:59 +08:00
										 |  |  |         $favourites = $topFavourites->run(6); | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  |         $recentlyUpdatedPages = $this->queries->pages->visibleForList() | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  |             ->where('draft', false) | 
					
						
							|  |  |  |             ->orderBy('updated_at', 'desc') | 
					
						
							|  |  |  |             ->take($favourites->count() > 0 ? 5 : 10) | 
					
						
							|  |  |  |             ->get(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         $homepageOptions = ['default', 'books', 'bookshelves', 'page']; | 
					
						
							|  |  |  |         $homepageOption = setting('app-homepage-type', 'default'); | 
					
						
							|  |  |  |         if (!in_array($homepageOption, $homepageOptions)) { | 
					
						
							|  |  |  |             $homepageOption = 'default'; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         $commonData = [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'activity'             => $activity, | 
					
						
							|  |  |  |             'recents'              => $recents, | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |             'recentlyUpdatedPages' => $recentlyUpdatedPages, | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             'draftPages'           => $draftPages, | 
					
						
							|  |  |  |             'favourites'           => $favourites, | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 00:31:59 +08:00
										 |  |  |         // Add required list ordering & sorting for books & shelves views.
 | 
					
						
							|  |  |  |         if ($homepageOption === 'bookshelves' || $homepageOption === 'books') { | 
					
						
							|  |  |  |             $key = $homepageOption; | 
					
						
							| 
									
										
										
										
											2021-02-08 07:12:05 +08:00
										 |  |  |             $view = setting()->getForCurrentUser($key . '_view_type'); | 
					
						
							| 
									
										
										
										
											2022-11-01 22:53:36 +08:00
										 |  |  |             $listOptions = SimpleListOptions::fromRequest($request, $key)->withSortOptions([ | 
					
						
							|  |  |  |                 'name' => trans('common.sort_name'), | 
					
						
							| 
									
										
										
										
											2019-04-07 00:31:59 +08:00
										 |  |  |                 'created_at' => trans('common.sort_created_at'), | 
					
						
							|  |  |  |                 'updated_at' => trans('common.sort_updated_at'), | 
					
						
							| 
									
										
										
										
											2022-11-01 22:53:36 +08:00
										 |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-07 00:31:59 +08:00
										 |  |  |             $commonData = array_merge($commonData, [ | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |                 'view'        => $view, | 
					
						
							| 
									
										
										
										
											2022-11-01 22:53:36 +08:00
										 |  |  |                 'listOptions' => $listOptions, | 
					
						
							| 
									
										
										
										
											2019-04-07 00:31:59 +08:00
										 |  |  |             ]); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         if ($homepageOption === 'bookshelves') { | 
					
						
							| 
									
										
										
										
											2024-02-05 03:32:19 +08:00
										 |  |  |             $shelves = $this->queries->shelves->visibleForListWithCover() | 
					
						
							|  |  |  |                 ->orderBy($commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder()) | 
					
						
							|  |  |  |                 ->paginate(18); | 
					
						
							| 
									
										
										
										
											2019-04-07 00:31:59 +08:00
										 |  |  |             $data = array_merge($commonData, ['shelves' => $shelves]); | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:15:58 +08:00
										 |  |  |             return view('home.shelves', $data); | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         if ($homepageOption === 'books') { | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  |             $books = $this->queries->books->visibleForListWithCover() | 
					
						
							|  |  |  |                 ->orderBy($commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder()) | 
					
						
							|  |  |  |                 ->paginate(18); | 
					
						
							| 
									
										
										
										
											2019-04-07 00:31:59 +08:00
										 |  |  |             $data = array_merge($commonData, ['books' => $books]); | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:15:58 +08:00
										 |  |  |             return view('home.books', $data); | 
					
						
							| 
									
										
										
										
											2018-05-10 11:35:18 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         if ($homepageOption === 'page') { | 
					
						
							|  |  |  |             $homepageSetting = setting('app-homepage', '0:'); | 
					
						
							|  |  |  |             $id = intval(explode(':', $homepageSetting)[0]); | 
					
						
							| 
									
										
										
										
											2021-10-04 18:26:26 +08:00
										 |  |  |             /** @var Page $customHomepage */ | 
					
						
							| 
									
										
										
										
											2024-02-05 01:35:16 +08:00
										 |  |  |             $customHomepage = $this->queries->pages->start()->where('draft', '=', false)->findOrFail($id); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             $pageContent = new PageContent($customHomepage); | 
					
						
							| 
									
										
										
										
											2021-10-04 18:26:26 +08:00
										 |  |  |             $customHomepage->html = $pageContent->render(false); | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:15:58 +08:00
										 |  |  |             return view('home.specific-page', array_merge($commonData, ['customHomepage' => $customHomepage])); | 
					
						
							| 
									
										
										
										
											2017-08-28 20:38:32 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-09-22 17:18:10 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:15:58 +08:00
										 |  |  |         return view('home.default', $commonData); | 
					
						
							| 
									
										
										
										
											2015-08-17 03:11:21 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-09-22 17:19:34 +08:00
										 |  |  | } |