mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-08-09 10:22:51 +03:00
Added indexes, Reduced queries on pages
This commit is contained in:
10
app/Book.php
10
app/Book.php
@@ -27,16 +27,6 @@ class Book extends Entity
|
||||
return $this->hasMany('BookStack\Chapter');
|
||||
}
|
||||
|
||||
public function children()
|
||||
{
|
||||
$pages = $this->pages()->where('chapter_id', '=', 0)->get();
|
||||
$chapters = $this->chapters()->get();
|
||||
foreach($chapters as $chapter) {
|
||||
$pages->push($chapter);
|
||||
}
|
||||
return $pages->sortBy('priority');
|
||||
}
|
||||
|
||||
public function getExcerpt($length = 100)
|
||||
{
|
||||
return strlen($this->description) > $length ? substr($this->description, 0, $length-3) . '...' : $this->description;
|
||||
|
@@ -18,7 +18,8 @@ class Chapter extends Entity
|
||||
|
||||
public function getUrl()
|
||||
{
|
||||
return '/books/' . $this->book->slug . '/chapter/' . $this->slug;
|
||||
$bookSlug = isset($this->bookSlug) ? $this->bookSlug : $this->book->slug;
|
||||
return '/books/' . $bookSlug. '/chapter/' . $this->slug;
|
||||
}
|
||||
|
||||
public function getExcerpt($length = 100)
|
||||
|
@@ -89,7 +89,8 @@ class BookController extends Controller
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($slug);
|
||||
Views::add($book);
|
||||
return view('books/show', ['book' => $book, 'current' => $book]);
|
||||
$bookChildren = $this->bookRepo->getChildren($book);
|
||||
return view('books/show', ['book' => $book, 'current' => $book, 'bookChildren' => $bookChildren]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -80,8 +80,9 @@ class ChapterController extends Controller
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$chapter = $this->chapterRepo->getBySlug($chapterSlug, $book->id);
|
||||
$sidebarTree = $this->bookRepo->getChildren($book);
|
||||
Views::add($chapter);
|
||||
return view('chapters/show', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter]);
|
||||
return view('chapters/show', ['book' => $book, 'chapter' => $chapter, 'current' => $chapter, 'sidebarTree' => $sidebarTree]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -87,8 +87,9 @@ class PageController extends Controller
|
||||
{
|
||||
$book = $this->bookRepo->getBySlug($bookSlug);
|
||||
$page = $this->pageRepo->getBySlug($pageSlug, $book->id);
|
||||
$sidebarTree = $this->bookRepo->getChildren($book);
|
||||
Views::add($page);
|
||||
return view('pages/show', ['page' => $page, 'book' => $book, 'current' => $page]);
|
||||
return view('pages/show', ['page' => $page, 'book' => $book, 'current' => $page, 'sidebarTree' => $sidebarTree]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -40,7 +40,9 @@ class Page extends Entity
|
||||
|
||||
public function getUrl()
|
||||
{
|
||||
return '/books/' . $this->book->slug . '/page/' . $this->slug;
|
||||
// TODO - Extract this and share with chapters
|
||||
$bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
|
||||
return '/books/' . $bookSlug . '/page/' . $this->slug;
|
||||
}
|
||||
|
||||
public function getExcerpt($length = 100)
|
||||
|
@@ -178,6 +178,30 @@ class BookRepo
|
||||
return $slug;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all child objects of a book.
|
||||
* Returns a sorted collection of Pages and Chapters.
|
||||
* Loads the bookslug onto child elements to prevent access database access for getting the slug.
|
||||
* @param Book $book
|
||||
* @return mixed
|
||||
*/
|
||||
public function getChildren(Book $book)
|
||||
{
|
||||
$pages = $book->pages()->where('chapter_id', '=', 0)->get();
|
||||
$chapters = $book->chapters()->with('pages')->get();
|
||||
$children = $pages->merge($chapters);
|
||||
$bookSlug = $book->slug;
|
||||
$children->each(function ($child) use ($bookSlug) {
|
||||
$child->setAttribute('bookSlug', $bookSlug);
|
||||
if ($child->isA('chapter')) {
|
||||
$child->pages->each(function ($page) use ($bookSlug) {
|
||||
$page->setAttribute('bookSlug', $bookSlug);
|
||||
});
|
||||
}
|
||||
});
|
||||
return $children->sortBy('priority');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get books by search term.
|
||||
* @param $term
|
||||
|
33
app/User.php
33
app/User.php
@@ -33,6 +33,12 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
*/
|
||||
protected $hidden = ['password', 'remember_token'];
|
||||
|
||||
/**
|
||||
* This holds the user's permissions when loaded.
|
||||
* @var array
|
||||
*/
|
||||
protected $permissions;
|
||||
|
||||
/**
|
||||
* Returns a default guest user.
|
||||
*/
|
||||
@@ -40,7 +46,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
{
|
||||
return new static([
|
||||
'email' => 'guest',
|
||||
'name' => 'Guest'
|
||||
'name' => 'Guest'
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -58,7 +64,19 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
|
||||
public function getRoleAttribute()
|
||||
{
|
||||
return $this->roles()->first();
|
||||
return $this->roles()->with('permissions')->first();
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the user's permissions from thier role.
|
||||
*/
|
||||
private function loadPermissions()
|
||||
{
|
||||
if (isset($this->permissions)) return;
|
||||
$this->load('roles.permissions');
|
||||
$permissions = $this->roles[0]->permissions;
|
||||
$permissionsArray = $permissions->pluck('name')->all();
|
||||
$this->permissions = $permissionsArray;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -68,14 +86,11 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
*/
|
||||
public function can($permissionName)
|
||||
{
|
||||
if($this->email == 'guest') {
|
||||
if ($this->email == 'guest') {
|
||||
return false;
|
||||
}
|
||||
$permissions = $this->role->permissions()->get();
|
||||
$permissionSearch = $permissions->search(function ($item, $key) use ($permissionName) {
|
||||
return $item->name == $permissionName;
|
||||
});
|
||||
return $permissionSearch !== false;
|
||||
$this->loadPermissions();
|
||||
return array_search($permissionName, $this->permissions) !== false;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -114,7 +129,7 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
|
||||
*/
|
||||
public function hasSocialAccount($socialDriver = false)
|
||||
{
|
||||
if($socialDriver === false) {
|
||||
if ($socialDriver === false) {
|
||||
return $this->socialAccounts()->count() > 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user