| 
									
										
										
										
											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; | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | use BookStack\Entities\Models\Book; | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | use BookStack\Entities\Models\Page; | 
					
						
							| 
									
										
										
										
											2021-05-22 21:05:28 +08:00
										 |  |  | use BookStack\Entities\Queries\RecentlyViewed; | 
					
						
							|  |  |  | use BookStack\Entities\Queries\TopFavourites; | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  | use BookStack\Entities\Repos\BookRepo; | 
					
						
							|  |  |  | use BookStack\Entities\Repos\BookshelfRepo; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							| 
									
										
										
										
											2023-02-10 04:57:35 +08:00
										 |  |  | use BookStack\Uploads\FaviconHandler; | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Display the homepage. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-11-01 22:53:36 +08:00
										 |  |  |     public function index(Request $request, ActivityQueries $activities) | 
					
						
							| 
									
										
										
										
											2015-08-17 03:11:21 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-12-12 01:29:33 +08:00
										 |  |  |         $activity = $activities->latest(10); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |         $draftPages = []; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($this->isSignedIn()) { | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  |             $draftPages = Page::visible() | 
					
						
							|  |  |  |                 ->where('draft', '=', true) | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |                 ->where('created_by', '=', user()->id) | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  |                 ->orderBy('updated_at', 'desc') | 
					
						
							| 
									
										
										
										
											2021-01-02 09:22:41 +08:00
										 |  |  |                 ->with('book') | 
					
						
							| 
									
										
										
										
											2020-10-04 01:44:12 +08:00
										 |  |  |                 ->take(6) | 
					
						
							|  |  |  |                 ->get(); | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +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() ? | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |             (new RecentlyViewed())->run(12 * $recentFactor, 1) | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             : Book::visible()->orderBy('created_at', 'desc')->take(12 * $recentFactor)->get(); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |         $favourites = (new TopFavourites())->run(6); | 
					
						
							| 
									
										
										
										
											2021-01-02 09:22:41 +08:00
										 |  |  |         $recentlyUpdatedPages = Page::visible()->with('book') | 
					
						
							|  |  |  |             ->where('draft', false) | 
					
						
							|  |  |  |             ->orderBy('updated_at', 'desc') | 
					
						
							| 
									
										
										
										
											2021-11-24 02:18:49 +08:00
										 |  |  |             ->take($favourites->count() > 0 ? 5 : 10) | 
					
						
							| 
									
										
										
										
											2021-08-22 02:58:19 +08:00
										 |  |  |             ->select(Page::$listAttributes) | 
					
						
							| 
									
										
										
										
											2021-01-02 09:22:41 +08:00
										 |  |  |             ->get(); | 
					
						
							| 
									
										
										
										
											2017-08-28 20:38:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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'; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-05-10 11:35:18 +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
										 |  |  |         ]; | 
					
						
							| 
									
										
										
										
											2018-05-10 11:35:18 +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
										 |  |  |             ]); | 
					
						
							| 
									
										
										
										
											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
										 |  |  |             ]); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         if ($homepageOption === 'bookshelves') { | 
					
						
							| 
									
										
										
										
											2023-09-17 01:25:08 +08:00
										 |  |  |             $shelves = app()->make(BookshelfRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder()); | 
					
						
							| 
									
										
										
										
											2019-04-07 00:31:59 +08:00
										 |  |  |             $data = array_merge($commonData, ['shelves' => $shelves]); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:15:58 +08:00
										 |  |  |             return view('home.shelves', $data); | 
					
						
							| 
									
										
										
										
											2018-09-20 22:27:30 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($homepageOption === 'books') { | 
					
						
							| 
									
										
										
										
											2023-09-17 01:25:08 +08:00
										 |  |  |             $books = app()->make(BookRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder()); | 
					
						
							| 
									
										
										
										
											2019-04-07 00:31:59 +08:00
										 |  |  |             $data = array_merge($commonData, ['books' => $books]); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:15:58 +08:00
										 |  |  |             return view('home.books', $data); | 
					
						
							| 
									
										
										
										
											2018-05-10 11:35:18 +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 */ | 
					
						
							| 
									
										
										
										
											2019-10-05 19:55:01 +08:00
										 |  |  |             $customHomepage = Page::query()->where('draft', '=', false)->findOrFail($id); | 
					
						
							|  |  |  |             $pageContent = new PageContent($customHomepage); | 
					
						
							| 
									
										
										
										
											2021-10-04 18:26:26 +08:00
										 |  |  |             $customHomepage->html = $pageContent->render(false); | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +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
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-08-22 20:15:58 +08:00
										 |  |  |         return view('home.default', $commonData); | 
					
						
							| 
									
										
										
										
											2015-08-17 03:11:21 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-31 19:41:40 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * Show the view for /robots.txt. | 
					
						
							| 
									
										
										
										
											2018-03-31 19:41:40 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-08-22 20:15:58 +08:00
										 |  |  |     public function robots() | 
					
						
							| 
									
										
										
										
											2018-03-31 19:41:40 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $sitePublic = setting('app-public', false); | 
					
						
							|  |  |  |         $allowRobots = config('app.allow_robots'); | 
					
						
							| 
									
										
										
										
											2021-01-17 21:41:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-31 19:41:40 +08:00
										 |  |  |         if ($allowRobots === null) { | 
					
						
							|  |  |  |             $allowRobots = $sitePublic; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-01-17 21:41:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-31 19:41:40 +08:00
										 |  |  |         return response() | 
					
						
							| 
									
										
										
										
											2021-08-22 20:15:58 +08:00
										 |  |  |             ->view('misc.robots', ['allowRobots' => $allowRobots]) | 
					
						
							| 
									
										
										
										
											2018-03-31 19:41:40 +08:00
										 |  |  |             ->header('Content-Type', 'text/plain'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-05-20 00:01:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Show the route for 404 responses. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-08-22 20:15:58 +08:00
										 |  |  |     public function notFound() | 
					
						
							| 
									
										
										
										
											2018-05-20 00:01:33 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-04-07 01:36:17 +08:00
										 |  |  |         return response()->view('errors.404', [], 404); | 
					
						
							| 
									
										
										
										
											2018-05-20 00:01:33 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-02-10 04:57:35 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Serve the application favicon. | 
					
						
							|  |  |  |      * Ensures a 'favicon.ico' file exists at the web root location (if writable) to be served | 
					
						
							|  |  |  |      * directly by the webserver in the future. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function favicon(FaviconHandler $favicons) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-02-10 05:16:27 +08:00
										 |  |  |         $exists = $favicons->restoreOriginalIfNotExists(); | 
					
						
							|  |  |  |         return response()->file($exists ? $favicons->getPath() : $favicons->getOriginalPath()); | 
					
						
							| 
									
										
										
										
											2023-02-10 04:57:35 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-08-17 03:11:21 +08:00
										 |  |  | } |