X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/76eb8fc5d7ae739d880e7305aa5593aa11424e54..0930e8519c508d46a848db93c76f258da5ee84a9:/app/Http/Controllers/HomeController.php diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index d0eb16399..f38bd71df 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -2,43 +2,133 @@ namespace BookStack\Http\Controllers; -use Illuminate\Http\Request; - -use BookStack\Http\Requests; -use BookStack\Http\Controllers\Controller; -use BookStack\Repos\BookRepo; -use BookStack\Services\ActivityService; -use BookStack\Services\Facades\Activity; +use BookStack\Actions\ActivityQueries; +use BookStack\Entities\Models\Book; +use BookStack\Entities\Models\Page; +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; class HomeController extends Controller { + /** + * Display the homepage. + */ + public function index(ActivityQueries $activities) + { + $activity = $activities->latest(10); + $draftPages = []; + + if ($this->isSignedIn()) { + $draftPages = Page::visible() + ->where('draft', '=', true) + ->where('created_by', '=', user()->id) + ->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 = Page::visible()->with('book') + ->where('draft', false) + ->orderBy('updated_at', 'desc') + ->take($favourites->count() > 0 ? 5 : 10) + ->select(Page::$listAttributes) + ->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'); + $sort = setting()->getForCurrentUser($key . '_sort', 'name'); + $order = setting()->getForCurrentUser($key . '_sort_order', 'asc'); + + $sortOptions = [ + '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, + 'sort' => $sort, + 'order' => $order, + 'sortOptions' => $sortOptions, + ]); + } - protected $activityService; - protected $bookRepo; + if ($homepageOption === 'bookshelves') { + $shelves = app(BookshelfRepo::class)->getAllPaginated(18, $commonData['sort'], $commonData['order']); + $data = array_merge($commonData, ['shelves' => $shelves]); + + return view('home.shelves', $data); + } + + if ($homepageOption === 'books') { + $bookRepo = app(BookRepo::class); + $books = $bookRepo->getAllPaginated(18, $commonData['sort'], $commonData['order']); + $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 = Page::query()->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); + } /** - * HomeController constructor. - * @param ActivityService $activityService - * @param BookRepo $bookRepo + * Show the view for /robots.txt. */ - public function __construct(ActivityService $activityService, BookRepo $bookRepo) + public function robots() { - $this->activityService = $activityService; - $this->bookRepo = $bookRepo; - parent::__construct(); - } + $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'); + } /** - * Display the homepage. - * - * @return Response + * Show the route for 404 responses. */ - public function index() + public function notFound() { - $books = $this->bookRepo->getAll(10); - $activity = $this->activityService->latest(); - return view('home', ['books' => $books, 'activity' => $activity]); + return response()->view('errors.404', [], 404); } - }