1
0
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:
Dan Brown
2015-11-26 23:45:04 +00:00
parent 3825ea8c14
commit 22f8a408fa
19 changed files with 319 additions and 48 deletions

View File

@@ -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;

View File

@@ -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)

View File

@@ -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]);
}
/**

View File

@@ -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]);
}
/**

View File

@@ -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]);
}
/**

View File

@@ -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)

View File

@@ -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

View File

@@ -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;
}