mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-12-12 13:33:46 +08:00
02d94c8798
Query of existing entity permissions during view permission generation could cause timeouts or SQL placeholder limits due to massive whereOr query generation, where an "or where" clause would be created for each entity type/id combo involved, which could be all within 20 books. This updates the query handling to use a query per type involved, with no "or where"s, and to be chunked at large entity counts. Also tweaked role-specific permission regen to chunk books at half-previous rate to prevent such a large scope being involved on each chunk. For #4695
48 lines
1.6 KiB
PHP
48 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace Database\Seeders;
|
|
|
|
use BookStack\Entities\Models\Book;
|
|
use BookStack\Entities\Models\Chapter;
|
|
use BookStack\Entities\Models\Page;
|
|
use BookStack\Permissions\JointPermissionBuilder;
|
|
use BookStack\Search\SearchIndex;
|
|
use BookStack\Users\Models\Role;
|
|
use BookStack\Users\Models\User;
|
|
use Illuminate\Database\Seeder;
|
|
use Illuminate\Support\Str;
|
|
|
|
class LargeContentSeeder extends Seeder
|
|
{
|
|
/**
|
|
* Run the database seeds.
|
|
*
|
|
* @return void
|
|
*/
|
|
public function run()
|
|
{
|
|
// Create an editor user
|
|
$editorUser = User::factory()->create();
|
|
$editorRole = Role::getRole('editor');
|
|
$editorUser->attachRole($editorRole);
|
|
|
|
/** @var Book $largeBook */
|
|
$largeBook = Book::factory()->create(['name' => 'Large book' . Str::random(10), 'created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
|
|
$chapters = Chapter::factory()->count(50)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]);
|
|
$largeBook->chapters()->saveMany($chapters);
|
|
|
|
$allPages = [];
|
|
|
|
foreach ($chapters as $chapter) {
|
|
$pages = Page::factory()->count(100)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id, 'chapter_id' => $chapter->id]);
|
|
$largeBook->pages()->saveMany($pages);
|
|
array_push($allPages, ...$pages->all());
|
|
}
|
|
|
|
$all = array_merge([$largeBook], $allPages, array_values($chapters->all()));
|
|
|
|
app()->make(JointPermissionBuilder::class)->rebuildForEntity($largeBook);
|
|
app()->make(SearchIndex::class)->indexEntities($all);
|
|
}
|
|
}
|