mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-02-01 02:33:01 +08:00
Made single entity updates more efficent
This commit is contained in:
parent
5570e858e5
commit
f8ae4c335e
|
@ -730,6 +730,7 @@ class EntityRepo
|
||||||
if ($chapter) $page->chapter_id = $chapter->id;
|
if ($chapter) $page->chapter_id = $chapter->id;
|
||||||
|
|
||||||
$book->pages()->save($page);
|
$book->pages()->save($page);
|
||||||
|
$page = $this->page->find($page->id);
|
||||||
$this->permissionService->buildJointPermissionsForEntity($page);
|
$this->permissionService->buildJointPermissionsForEntity($page);
|
||||||
return $page;
|
return $page;
|
||||||
}
|
}
|
||||||
|
|
|
@ -150,13 +150,22 @@ class PermissionService
|
||||||
$roles = $this->role->with('permissions')->get()->all();
|
$roles = $this->role->with('permissions')->get()->all();
|
||||||
|
|
||||||
// Chunk through all books
|
// Chunk through all books
|
||||||
$this->book->newQuery()->select(['id', 'restricted', 'created_by'])->with(['chapters' => function($query) {
|
$this->bookFetchQuery()->chunk(5, function ($books) use ($roles) {
|
||||||
|
$this->buildJointPermissionsForBooks($books, $roles);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a query for fetching a book with it's children.
|
||||||
|
* @return QueryBuilder
|
||||||
|
*/
|
||||||
|
protected function bookFetchQuery()
|
||||||
|
{
|
||||||
|
return $this->book->newQuery()->select(['id', 'restricted', 'created_by'])->with(['chapters' => function($query) {
|
||||||
$query->select(['id', 'restricted', 'created_by', 'book_id']);
|
$query->select(['id', 'restricted', 'created_by', 'book_id']);
|
||||||
}, 'pages' => function($query) {
|
}, 'pages' => function($query) {
|
||||||
$query->select(['id', 'restricted', 'created_by', 'book_id', 'chapter_id']);
|
$query->select(['id', 'restricted', 'created_by', 'book_id', 'chapter_id']);
|
||||||
}])->chunk(5, function ($books) use ($roles) {
|
}]);
|
||||||
$this->buildJointPermissionsForBooks($books, $roles);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -188,14 +197,22 @@ class PermissionService
|
||||||
*/
|
*/
|
||||||
public function buildJointPermissionsForEntity(Entity $entity)
|
public function buildJointPermissionsForEntity(Entity $entity)
|
||||||
{
|
{
|
||||||
$roles = $this->role->newQuery()->get();
|
$entities = [$entity];
|
||||||
$book = ($entity->isA('book')) ? $entity : $entity->book;
|
if ($entity->isA('book')) {
|
||||||
$book = $this->book->newQuery()->select(['id', 'restricted', 'created_by'])->with(['chapters' => function($query) {
|
$books = $this->bookFetchQuery()->where('id', '=', $entity->id)->get();
|
||||||
$query->select(['id', 'restricted', 'created_by', 'book_id']);
|
$this->buildJointPermissionsForBooks($books, $this->role->newQuery()->get(), true);
|
||||||
}, 'pages' => function($query) {
|
return;
|
||||||
$query->select(['id', 'restricted', 'created_by', 'book_id', 'chapter_id']);
|
}
|
||||||
}])->where('id', '=', $book->id)->get();
|
|
||||||
$this->buildJointPermissionsForBooks($book, $roles, true);
|
$entities[] = $entity->book;
|
||||||
|
if ($entity->isA('page') && $entity->chapter_id) $entities[] = $entity->chapter;
|
||||||
|
if ($entity->isA('chapter')) {
|
||||||
|
foreach ($entity->pages as $page) {
|
||||||
|
$entities[] = $page;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->deleteManyJointPermissionsForEntities($entities);
|
||||||
|
$this->buildJointPermissionsForEntities(collect($entities));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -204,7 +221,7 @@ class PermissionService
|
||||||
*/
|
*/
|
||||||
public function buildJointPermissionsForEntities(Collection $entities)
|
public function buildJointPermissionsForEntities(Collection $entities)
|
||||||
{
|
{
|
||||||
$roles = $this->role->get();
|
$roles = $this->role->newQuery()->get();
|
||||||
$this->deleteManyJointPermissionsForEntities($entities->all());
|
$this->deleteManyJointPermissionsForEntities($entities->all());
|
||||||
$this->createManyJointPermissions($entities, $roles);
|
$this->createManyJointPermissions($entities, $roles);
|
||||||
}
|
}
|
||||||
|
@ -219,11 +236,7 @@ class PermissionService
|
||||||
$this->deleteManyJointPermissionsForRoles($roles);
|
$this->deleteManyJointPermissionsForRoles($roles);
|
||||||
|
|
||||||
// Chunk through all books
|
// Chunk through all books
|
||||||
$this->book->newQuery()->select(['id', 'restricted', 'created_by'])->with(['chapters' => function($query) {
|
$this->bookFetchQuery()->chunk(5, function ($books) use ($roles) {
|
||||||
$query->select(['id', 'restricted', 'created_by', 'book_id']);
|
|
||||||
}, 'pages' => function($query) {
|
|
||||||
$query->select(['id', 'restricted', 'created_by', 'book_id', 'chapter_id']);
|
|
||||||
}])->chunk(5, function ($books) use ($roles) {
|
|
||||||
$this->buildJointPermissionsForBooks($books, $roles);
|
$this->buildJointPermissionsForBooks($books, $roles);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user