]> BookStack Code Mirror - bookstack/blob - app/App/HomeController.php
Merge pull request #5625 from BookStackApp/avif_images
[bookstack] / app / App / HomeController.php
1 <?php
2
3 namespace BookStack\App;
4
5 use BookStack\Activity\ActivityQueries;
6 use BookStack\Entities\Models\Page;
7 use BookStack\Entities\Queries\EntityQueries;
8 use BookStack\Entities\Queries\QueryRecentlyViewed;
9 use BookStack\Entities\Queries\QueryTopFavourites;
10 use BookStack\Entities\Tools\PageContent;
11 use BookStack\Http\Controller;
12 use BookStack\Util\SimpleListOptions;
13 use Illuminate\Http\Request;
14
15 class HomeController extends Controller
16 {
17     public function __construct(
18         protected EntityQueries $queries,
19     ) {
20     }
21
22     /**
23      * Display the homepage.
24      */
25     public function index(
26         Request $request,
27         ActivityQueries $activities,
28         QueryRecentlyViewed $recentlyViewed,
29         QueryTopFavourites $topFavourites,
30     ) {
31         $activity = $activities->latest(10);
32         $draftPages = [];
33
34         if ($this->isSignedIn()) {
35             $draftPages = $this->queries->pages->currentUserDraftsForList()
36                 ->orderBy('updated_at', 'desc')
37                 ->with('book')
38                 ->take(6)
39                 ->get();
40         }
41
42         $recentFactor = count($draftPages) > 0 ? 0.5 : 1;
43         $recents = $this->isSignedIn() ?
44             $recentlyViewed->run(12 * $recentFactor, 1)
45             : $this->queries->books->visibleForList()->orderBy('created_at', 'desc')->take(12 * $recentFactor)->get();
46         $favourites = $topFavourites->run(6);
47         $recentlyUpdatedPages = $this->queries->pages->visibleForList()
48             ->where('draft', false)
49             ->orderBy('updated_at', 'desc')
50             ->take($favourites->count() > 0 ? 5 : 10)
51             ->get();
52
53         $homepageOptions = ['default', 'books', 'bookshelves', 'page'];
54         $homepageOption = setting('app-homepage-type', 'default');
55         if (!in_array($homepageOption, $homepageOptions)) {
56             $homepageOption = 'default';
57         }
58
59         $commonData = [
60             'activity'             => $activity,
61             'recents'              => $recents,
62             'recentlyUpdatedPages' => $recentlyUpdatedPages,
63             'draftPages'           => $draftPages,
64             'favourites'           => $favourites,
65         ];
66
67         // Add required list ordering & sorting for books & shelves views.
68         if ($homepageOption === 'bookshelves' || $homepageOption === 'books') {
69             $key = $homepageOption;
70             $view = setting()->getForCurrentUser($key . '_view_type');
71             $listOptions = SimpleListOptions::fromRequest($request, $key)->withSortOptions([
72                 'name' => trans('common.sort_name'),
73                 'created_at' => trans('common.sort_created_at'),
74                 'updated_at' => trans('common.sort_updated_at'),
75             ]);
76
77             $commonData = array_merge($commonData, [
78                 'view'        => $view,
79                 'listOptions' => $listOptions,
80             ]);
81         }
82
83         if ($homepageOption === 'bookshelves') {
84             $shelves = $this->queries->shelves->visibleForListWithCover()
85                 ->orderBy($commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder())
86                 ->paginate(18);
87             $data = array_merge($commonData, ['shelves' => $shelves]);
88
89             return view('home.shelves', $data);
90         }
91
92         if ($homepageOption === 'books') {
93             $books = $this->queries->books->visibleForListWithCover()
94                 ->orderBy($commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder())
95                 ->paginate(18);
96             $data = array_merge($commonData, ['books' => $books]);
97
98             return view('home.books', $data);
99         }
100
101         if ($homepageOption === 'page') {
102             $homepageSetting = setting('app-homepage', '0:');
103             $id = intval(explode(':', $homepageSetting)[0]);
104             /** @var Page $customHomepage */
105             $customHomepage = $this->queries->pages->start()->where('draft', '=', false)->findOrFail($id);
106             $pageContent = new PageContent($customHomepage);
107             $customHomepage->html = $pageContent->render(false);
108
109             return view('home.specific-page', array_merge($commonData, ['customHomepage' => $customHomepage]));
110         }
111
112         return view('home.default', $commonData);
113     }
114 }
Morty Proxy This is a proxified and sanitized view of the page, visit original site.