/**
* Prepare the local entity cache and ensure it's empty
+ * @param Entity[] $entities
*/
- protected function readyEntityCache()
+ protected function readyEntityCache($entities = [])
{
- $this->entityCache = [
- 'books' => collect(),
- 'chapters' => collect()
- ];
+ $this->entityCache = [];
+
+ foreach ($entities as $entity) {
+ $type = $entity->getType();
+ if (!isset($this->entityCache[$type])) {
+ $this->entityCache[$type] = collect();
+ }
+ $this->entityCache[$type]->put($entity->id, $entity);
+ }
}
/**
*/
protected function getBook($bookId)
{
- if (isset($this->entityCache['books']) && $this->entityCache['books']->has($bookId)) {
- return $this->entityCache['books']->get($bookId);
+ if (isset($this->entityCache['book']) && $this->entityCache['book']->has($bookId)) {
+ return $this->entityCache['book']->get($bookId);
}
$book = $this->book->find($bookId);
if ($book === null) {
$book = false;
}
- if (isset($this->entityCache['books'])) {
- $this->entityCache['books']->put($bookId, $book);
- }
return $book;
}
*/
protected function getChapter($chapterId)
{
- if (isset($this->entityCache['chapters']) && $this->entityCache['chapters']->has($chapterId)) {
- return $this->entityCache['chapters']->get($chapterId);
+ if (isset($this->entityCache['chapter']) && $this->entityCache['chapter']->has($chapterId)) {
+ return $this->entityCache['chapter']->get($chapterId);
}
$chapter = $this->chapter->find($chapterId);
if ($chapter === null) {
$chapter = false;
}
- if (isset($this->entityCache['chapters'])) {
- $this->entityCache['chapters']->put($chapterId, $chapter);
- }
return $chapter;
}
* @param Collection $books
* @param array $roles
* @param bool $deleteOld
+ * @throws \Throwable
*/
protected function buildJointPermissionsForBooks($books, $roles, $deleteOld = false)
{
$this->deleteManyJointPermissionsForRoles($roles);
// Chunk through all books
- $this->bookFetchQuery()->chunk(5, function ($books) use ($roles) {
+ $this->bookFetchQuery()->chunk(20, function ($books) use ($roles) {
$this->buildJointPermissionsForBooks($books, $roles);
});
}
/**
* Delete the entity jointPermissions for a particular entity.
* @param Entity $entity
+ * @throws \Throwable
*/
public function deleteJointPermissionsForEntity(Entity $entity)
{
/**
* Delete all of the entity jointPermissions for a list of entities.
* @param Entity[] $entities
+ * @throws \Throwable
*/
protected function deleteManyJointPermissionsForEntities($entities)
{
* Create & Save entity jointPermissions for many entities and jointPermissions.
* @param Collection $entities
* @param array $roles
+ * @throws \Throwable
*/
protected function createManyJointPermissions($entities, $roles)
{
- $this->readyEntityCache();
+ $this->readyEntityCache($entities);
$jointPermissions = [];
// Fetch Entity Permissions and create a mapping of entity restricted statuses
// Create a mapping of role permissions
$rolePermissionMap = [];
foreach ($roles as $role) {
- foreach ($role->getRelationValue('permissions') as $permission) {
+ foreach ($role->permissions as $permission) {
$rolePermissionMap[$role->getRawAttribute('id') . ':' . $permission->getRawAttribute('name')] = true;
}
}
$role = \BookStack\Role::getRole('viewer');
$viewerUser->attachRole($role);
- factory(\BookStack\Book::class, 20)->create(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id])
+ factory(\BookStack\Book::class, 5)->create(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id])
->each(function($book) use ($editorUser) {
- $chapters = factory(\BookStack\Chapter::class, 5)->create(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id])
+ $chapters = factory(\BookStack\Chapter::class, 3)->create(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id])
->each(function($chapter) use ($editorUser, $book){
- $pages = factory(\BookStack\Page::class, 5)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id, 'book_id' => $book->id]);
+ $pages = factory(\BookStack\Page::class, 3)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id, 'book_id' => $book->id]);
$chapter->pages()->saveMany($pages);
});
$pages = factory(\BookStack\Page::class, 3)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
--- /dev/null
+<?php
+
+use Illuminate\Database\Seeder;
+
+class LargeContentSeeder extends Seeder
+{
+ /**
+ * Run the database seeds.
+ *
+ * @return void
+ */
+ public function run()
+ {
+ // Create an editor user
+ $editorUser = factory(\BookStack\User::class)->create();
+ $editorRole = \BookStack\Role::getRole('editor');
+ $editorUser->attachRole($editorRole);
+
+ $largeBook = factory(\BookStack\Book::class)->create(['name' => 'Large book' . str_random(10), 'created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
+ $pages = factory(\BookStack\Page::class, 200)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
+ $chapters = factory(\BookStack\Chapter::class, 50)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
+ $largeBook->pages()->saveMany($pages);
+ $largeBook->chapters()->saveMany($chapters);
+ app(\BookStack\Services\PermissionService::class)->buildJointPermissions();
+ app(\BookStack\Services\SearchService::class)->indexAllEntities();
+ }
+}