mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-10-01 01:36:00 -04:00
a70ed81908
Removes page/chpater addSelect global query, to load book slug, and instead extracts base queries to be managed in new static class, while updating specific entitiy relation loading to use our more efficient MixedEntityListLoader where appropriate. Related to #4823
150 lines
5.2 KiB
PHP
150 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace BookStack\App;
|
|
|
|
use BookStack\Activity\ActivityQueries;
|
|
use BookStack\Entities\Models\Book;
|
|
use BookStack\Entities\Models\Page;
|
|
use BookStack\Entities\Queries\PageQueries;
|
|
use BookStack\Entities\Queries\RecentlyViewed;
|
|
use BookStack\Entities\Queries\TopFavourites;
|
|
use BookStack\Entities\Repos\BookRepo;
|
|
use BookStack\Entities\Repos\BookshelfRepo;
|
|
use BookStack\Entities\Tools\PageContent;
|
|
use BookStack\Http\Controller;
|
|
use BookStack\Uploads\FaviconHandler;
|
|
use BookStack\Util\SimpleListOptions;
|
|
use Illuminate\Http\Request;
|
|
|
|
class HomeController extends Controller
|
|
{
|
|
/**
|
|
* Display the homepage.
|
|
*/
|
|
public function index(Request $request, ActivityQueries $activities)
|
|
{
|
|
$activity = $activities->latest(10);
|
|
$draftPages = [];
|
|
|
|
if ($this->isSignedIn()) {
|
|
$draftPages = PageQueries::currentUserDraftsForList()
|
|
->orderBy('updated_at', 'desc')
|
|
->with('book')
|
|
->take(6)
|
|
->get();
|
|
}
|
|
|
|
$recentFactor = count($draftPages) > 0 ? 0.5 : 1;
|
|
$recents = $this->isSignedIn() ?
|
|
(new RecentlyViewed())->run(12 * $recentFactor, 1)
|
|
: Book::visible()->orderBy('created_at', 'desc')->take(12 * $recentFactor)->get();
|
|
$favourites = (new TopFavourites())->run(6);
|
|
$recentlyUpdatedPages = PageQueries::visibleForList()
|
|
->where('draft', false)
|
|
->orderBy('updated_at', 'desc')
|
|
->take($favourites->count() > 0 ? 5 : 10)
|
|
->get();
|
|
|
|
$homepageOptions = ['default', 'books', 'bookshelves', 'page'];
|
|
$homepageOption = setting('app-homepage-type', 'default');
|
|
if (!in_array($homepageOption, $homepageOptions)) {
|
|
$homepageOption = 'default';
|
|
}
|
|
|
|
$commonData = [
|
|
'activity' => $activity,
|
|
'recents' => $recents,
|
|
'recentlyUpdatedPages' => $recentlyUpdatedPages,
|
|
'draftPages' => $draftPages,
|
|
'favourites' => $favourites,
|
|
];
|
|
|
|
// Add required list ordering & sorting for books & shelves views.
|
|
if ($homepageOption === 'bookshelves' || $homepageOption === 'books') {
|
|
$key = $homepageOption;
|
|
$view = setting()->getForCurrentUser($key . '_view_type');
|
|
$listOptions = SimpleListOptions::fromRequest($request, $key)->withSortOptions([
|
|
'name' => trans('common.sort_name'),
|
|
'created_at' => trans('common.sort_created_at'),
|
|
'updated_at' => trans('common.sort_updated_at'),
|
|
]);
|
|
|
|
$commonData = array_merge($commonData, [
|
|
'view' => $view,
|
|
'listOptions' => $listOptions,
|
|
]);
|
|
}
|
|
|
|
if ($homepageOption === 'bookshelves') {
|
|
$shelves = app()->make(BookshelfRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
|
|
$data = array_merge($commonData, ['shelves' => $shelves]);
|
|
|
|
return view('home.shelves', $data);
|
|
}
|
|
|
|
if ($homepageOption === 'books') {
|
|
$books = app()->make(BookRepo::class)->getAllPaginated(18, $commonData['listOptions']->getSort(), $commonData['listOptions']->getOrder());
|
|
$data = array_merge($commonData, ['books' => $books]);
|
|
|
|
return view('home.books', $data);
|
|
}
|
|
|
|
if ($homepageOption === 'page') {
|
|
$homepageSetting = setting('app-homepage', '0:');
|
|
$id = intval(explode(':', $homepageSetting)[0]);
|
|
/** @var Page $customHomepage */
|
|
$customHomepage = PageQueries::start()->where('draft', '=', false)->findOrFail($id);
|
|
$pageContent = new PageContent($customHomepage);
|
|
$customHomepage->html = $pageContent->render(false);
|
|
|
|
return view('home.specific-page', array_merge($commonData, ['customHomepage' => $customHomepage]));
|
|
}
|
|
|
|
return view('home.default', $commonData);
|
|
}
|
|
|
|
/**
|
|
* Show the view for /robots.txt.
|
|
*/
|
|
public function robots()
|
|
{
|
|
$sitePublic = setting('app-public', false);
|
|
$allowRobots = config('app.allow_robots');
|
|
|
|
if ($allowRobots === null) {
|
|
$allowRobots = $sitePublic;
|
|
}
|
|
|
|
return response()
|
|
->view('misc.robots', ['allowRobots' => $allowRobots])
|
|
->header('Content-Type', 'text/plain');
|
|
}
|
|
|
|
/**
|
|
* Show the route for 404 responses.
|
|
*/
|
|
public function notFound()
|
|
{
|
|
return response()->view('errors.404', [], 404);
|
|
}
|
|
|
|
/**
|
|
* 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)
|
|
{
|
|
$exists = $favicons->restoreOriginalIfNotExists();
|
|
return response()->file($exists ? $favicons->getPath() : $favicons->getOriginalPath());
|
|
}
|
|
|
|
/**
|
|
* Serve a PWA application manifest.
|
|
*/
|
|
public function pwaManifest(PwaManifestBuilder $manifestBuilder)
|
|
{
|
|
return response()->json($manifestBuilder->build());
|
|
}
|
|
}
|