diff --git a/app/Actions/Activity.php b/app/Actions/Activity.php index 42cc95613..9d256c9b2 100644 --- a/app/Actions/Activity.php +++ b/app/Actions/Activity.php @@ -3,7 +3,7 @@ namespace BookStack\Actions; use BookStack\Auth\User; -use BookStack\Entities\Entity; +use BookStack\Entities\Models\Entity; use BookStack\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Support\Str; diff --git a/app/Actions/ActivityService.php b/app/Actions/ActivityService.php index 0b3b0f0bc..b2a35fd2a 100644 --- a/app/Actions/ActivityService.php +++ b/app/Actions/ActivityService.php @@ -2,9 +2,9 @@ use BookStack\Auth\Permissions\PermissionService; use BookStack\Auth\User; -use BookStack\Entities\Chapter; -use BookStack\Entities\Entity; -use BookStack\Entities\Page; +use BookStack\Entities\Models\Chapter; +use BookStack\Entities\Models\Entity; +use BookStack\Entities\Models\Page; use BookStack\Interfaces\Loggable; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Relations\Relation; diff --git a/app/Actions/CommentRepo.php b/app/Actions/CommentRepo.php index 1d46e781c..13a83e7fd 100644 --- a/app/Actions/CommentRepo.php +++ b/app/Actions/CommentRepo.php @@ -1,6 +1,6 @@ searchService = $searchService; + $this->searchIndex = $searchIndex; } /** @@ -45,10 +43,9 @@ class RegenerateSearch extends Command $connection = DB::getDefaultConnection(); if ($this->option('database') !== null) { DB::setDefaultConnection($this->option('database')); - $this->searchService->setConnection(DB::connection($this->option('database'))); } - $this->searchService->indexAllEntities(); + $this->searchIndex->indexAllEntities(); DB::setDefaultConnection($connection); $this->comment('Search index regenerated'); } diff --git a/app/Entities/BreadcrumbsViewComposer.php b/app/Entities/BreadcrumbsViewComposer.php index fd0152a7b..cf7cf296c 100644 --- a/app/Entities/BreadcrumbsViewComposer.php +++ b/app/Entities/BreadcrumbsViewComposer.php @@ -1,5 +1,6 @@ make(SearchService::class); - $searchService->indexEntity(clone $this); + app(SearchIndex::class)->indexEntity(clone $this); } /** diff --git a/app/Entities/Models/HasCoverImage.php b/app/Entities/Models/HasCoverImage.php index 31277f4b6..f3a486d18 100644 --- a/app/Entities/Models/HasCoverImage.php +++ b/app/Entities/Models/HasCoverImage.php @@ -1,7 +1,7 @@ searchTerm = $searchTerm; + $this->entityProvider = $entityProvider; + } + + + /** + * Index the given entity. + */ + public function indexEntity(Entity $entity) + { + $this->deleteEntityTerms($entity); + $nameTerms = $this->generateTermArrayFromText($entity->name, 5 * $entity->searchFactor); + $bodyTerms = $this->generateTermArrayFromText($entity->getText() ?? '', 1 * $entity->searchFactor); + $terms = array_merge($nameTerms, $bodyTerms); + foreach ($terms as $index => $term) { + $terms[$index]['entity_type'] = $entity->getMorphClass(); + $terms[$index]['entity_id'] = $entity->id; + } + $this->searchTerm->newQuery()->insert($terms); + } + + /** + * Index multiple Entities at once + * @param Entity[] $entities + */ + protected function indexEntities(array $entities) + { + $terms = []; + foreach ($entities as $entity) { + $nameTerms = $this->generateTermArrayFromText($entity->name, 5 * $entity->searchFactor); + $bodyTerms = $this->generateTermArrayFromText($entity->getText(), 1 * $entity->searchFactor); + foreach (array_merge($nameTerms, $bodyTerms) as $term) { + $term['entity_id'] = $entity->id; + $term['entity_type'] = $entity->getMorphClass(); + $terms[] = $term; + } + } + + $chunkedTerms = array_chunk($terms, 500); + foreach ($chunkedTerms as $termChunk) { + $this->searchTerm->newQuery()->insert($termChunk); + } + } + + /** + * Delete and re-index the terms for all entities in the system. + */ + public function indexAllEntities() + { + $this->searchTerm->newQuery()->truncate(); + + foreach ($this->entityProvider->all() as $entityModel) { + $selectFields = ['id', 'name', $entityModel->textField]; + $entityModel->newQuery() + ->withTrashed() + ->select($selectFields) + ->chunk(1000, function ($entities) { + $this->indexEntities($entities); + }); + } + } + + /** + * Delete related Entity search terms. + */ + public function deleteEntityTerms(Entity $entity) + { + $entity->searchTerms()->delete(); + } + + /** + * Create a scored term array from the given text. + */ + protected function generateTermArrayFromText(string $text, int $scoreAdjustment = 1): array + { + $tokenMap = []; // {TextToken => OccurrenceCount} + $splitChars = " \n\t.,!?:;()[]{}<>`'\""; + $token = strtok($text, $splitChars); + + while ($token !== false) { + if (!isset($tokenMap[$token])) { + $tokenMap[$token] = 0; + } + $tokenMap[$token]++; + $token = strtok($splitChars); + } + + $terms = []; + foreach ($tokenMap as $token => $count) { + $terms[] = [ + 'term' => $token, + 'score' => $count * $scoreAdjustment + ]; + } + + return $terms; + } +} diff --git a/app/Entities/Tools/SearchOptions.php b/app/Entities/Tools/SearchOptions.php index a121bd793..60e3a9b78 100644 --- a/app/Entities/Tools/SearchOptions.php +++ b/app/Entities/Tools/SearchOptions.php @@ -1,4 +1,4 @@ -=', '=', '<', '>', 'like', '!=']; - /** - * SearchService constructor. - */ - public function __construct(SearchTerm $searchTerm, EntityProvider $entityProvider, Connection $db, PermissionService $permissionService) + + public function __construct(EntityProvider $entityProvider, Connection $db, PermissionService $permissionService) { - $this->searchTerm = $searchTerm; $this->entityProvider = $entityProvider; $this->db = $db; $this->permissionService = $permissionService; } - /** - * Set the database connection - */ - public function setConnection(Connection $connection) - { - $this->db = $connection; - } - /** * Search all entities in the system. * The provided count is for each entity to search, @@ -115,11 +102,12 @@ class SearchService $search = $this->buildEntitySearchQuery($opts, $entityType)->where('book_id', '=', $bookId)->take(20)->get(); $results = $results->merge($search); } + return $results->sortByDesc('score')->take(20); } /** - * Search a book for entities + * Search a chapter for entities */ public function searchChapter(int $chapterId, string $searchString): Collection { @@ -134,7 +122,7 @@ class SearchService * matching instead of the items themselves. * @return \Illuminate\Database\Eloquent\Collection|int|static[] */ - public function searchEntityTable(SearchOptions $searchOpts, string $entityType = 'page', int $page = 1, int $count = 20, string $action = 'view', bool $getCount = false) + protected function searchEntityTable(SearchOptions $searchOpts, string $entityType = 'page', int $page = 1, int $count = 20, string $action = 'view', bool $getCount = false) { $query = $this->buildEntitySearchQuery($searchOpts, $entityType, $action); if ($getCount) { @@ -155,28 +143,25 @@ class SearchService // Handle normal search terms if (count($searchOpts->searches) > 0) { - $subQuery = $this->db->table('search_terms')->select('entity_id', 'entity_type', \DB::raw('SUM(score) as score')); + $rawScoreSum = $this->db->raw('SUM(score) as score'); + $subQuery = $this->db->table('search_terms')->select('entity_id', 'entity_type', $rawScoreSum); $subQuery->where('entity_type', '=', $entity->getMorphClass()); $subQuery->where(function (Builder $query) use ($searchOpts) { foreach ($searchOpts->searches as $inputTerm) { $query->orWhere('term', 'like', $inputTerm .'%'); } })->groupBy('entity_type', 'entity_id'); - $entitySelect->join(\DB::raw('(' . $subQuery->toSql() . ') as s'), function (JoinClause $join) { + $entitySelect->join($this->db->raw('(' . $subQuery->toSql() . ') as s'), function (JoinClause $join) { $join->on('id', '=', 'entity_id'); })->selectRaw($entity->getTable().'.*, s.score')->orderBy('score', 'desc'); $entitySelect->mergeBindings($subQuery); } // Handle exact term matching - if (count($searchOpts->exacts) > 0) { - $entitySelect->where(function (EloquentBuilder $query) use ($searchOpts, $entity) { - foreach ($searchOpts->exacts as $inputTerm) { - $query->where(function (EloquentBuilder $query) use ($inputTerm, $entity) { - $query->where('name', 'like', '%'.$inputTerm .'%') - ->orWhere($entity->textField, 'like', '%'.$inputTerm .'%'); - }); - } + foreach ($searchOpts->exacts as $inputTerm) { + $entitySelect->where(function (EloquentBuilder $query) use ($inputTerm, $entity) { + $query->where('name', 'like', '%'.$inputTerm .'%') + ->orWhere($entity->textField, 'like', '%'.$inputTerm .'%'); }); } @@ -239,105 +224,6 @@ class SearchService return $query; } - /** - * Index the given entity. - */ - public function indexEntity(Entity $entity) - { - $this->deleteEntityTerms($entity); - $nameTerms = $this->generateTermArrayFromText($entity->name, 5 * $entity->searchFactor); - $bodyTerms = $this->generateTermArrayFromText($entity->getText(), 1 * $entity->searchFactor); - $terms = array_merge($nameTerms, $bodyTerms); - foreach ($terms as $index => $term) { - $terms[$index]['entity_type'] = $entity->getMorphClass(); - $terms[$index]['entity_id'] = $entity->id; - } - $this->searchTerm->newQuery()->insert($terms); - } - - /** - * Index multiple Entities at once - * @param \BookStack\Entities\Entity[] $entities - */ - protected function indexEntities($entities) - { - $terms = []; - foreach ($entities as $entity) { - $nameTerms = $this->generateTermArrayFromText($entity->name, 5 * $entity->searchFactor); - $bodyTerms = $this->generateTermArrayFromText($entity->getText(), 1 * $entity->searchFactor); - foreach (array_merge($nameTerms, $bodyTerms) as $term) { - $term['entity_id'] = $entity->id; - $term['entity_type'] = $entity->getMorphClass(); - $terms[] = $term; - } - } - - $chunkedTerms = array_chunk($terms, 500); - foreach ($chunkedTerms as $termChunk) { - $this->searchTerm->newQuery()->insert($termChunk); - } - } - - /** - * Delete and re-index the terms for all entities in the system. - */ - public function indexAllEntities() - { - $this->searchTerm->truncate(); - - foreach ($this->entityProvider->all() as $entityModel) { - $selectFields = ['id', 'name', $entityModel->textField]; - $entityModel->newQuery() - ->withTrashed() - ->select($selectFields) - ->chunk(1000, function ($entities) { - $this->indexEntities($entities); - }); - } - } - - /** - * Delete related Entity search terms. - * @param Entity $entity - */ - public function deleteEntityTerms(Entity $entity) - { - $entity->searchTerms()->delete(); - } - - /** - * Create a scored term array from the given text. - * @param $text - * @param float|int $scoreAdjustment - * @return array - */ - protected function generateTermArrayFromText($text, $scoreAdjustment = 1) - { - $tokenMap = []; // {TextToken => OccurrenceCount} - $splitChars = " \n\t.,!?:;()[]{}<>`'\""; - $token = strtok($text, $splitChars); - - while ($token !== false) { - if (!isset($tokenMap[$token])) { - $tokenMap[$token] = 0; - } - $tokenMap[$token]++; - $token = strtok($splitChars); - } - - $terms = []; - foreach ($tokenMap as $token => $count) { - $terms[] = [ - 'term' => $token, - 'score' => $count * $scoreAdjustment - ]; - } - return $terms; - } - - - - /** * Custom entity search filters */ diff --git a/app/Entities/Tools/ShelfContext.php b/app/Entities/Tools/ShelfContext.php index 0635bce1c..f3849bbb4 100644 --- a/app/Entities/Tools/ShelfContext.php +++ b/app/Entities/Tools/ShelfContext.php @@ -1,7 +1,7 @@ bookRepo = $bookRepo; @@ -85,8 +80,7 @@ class BookApiController extends ApiController /** * Delete a single book from the system. - * @throws NotifyException - * @throws BindingResolutionException + * @throws \Exception */ public function delete(string $id) { diff --git a/app/Http/Controllers/Api/BookExportApiController.php b/app/Http/Controllers/Api/BookExportApiController.php index 3bfa1d84f..386cc11fb 100644 --- a/app/Http/Controllers/Api/BookExportApiController.php +++ b/app/Http/Controllers/Api/BookExportApiController.php @@ -1,7 +1,7 @@ bookRepo = $bookRepo; $this->exportService = $exportService; diff --git a/app/Http/Controllers/Api/BookshelfApiController.php b/app/Http/Controllers/Api/BookshelfApiController.php index 212575c82..7f6aaa69f 100644 --- a/app/Http/Controllers/Api/BookshelfApiController.php +++ b/app/Http/Controllers/Api/BookshelfApiController.php @@ -1,7 +1,7 @@ chapterRepo = $chapterRepo; $this->exportService = $exportService; diff --git a/app/Http/Controllers/BookController.php b/app/Http/Controllers/BookController.php index 0fadc0f4d..b63fe911f 100644 --- a/app/Http/Controllers/BookController.php +++ b/app/Http/Controllers/BookController.php @@ -3,7 +3,7 @@ use Activity; use BookStack\Actions\ActivityType; use BookStack\Entities\Tools\BookContents; -use BookStack\Entities\Bookshelf; +use BookStack\Entities\Models\Bookshelf; use BookStack\Entities\Tools\ShelfContext; use BookStack\Entities\Repos\BookRepo; use BookStack\Exceptions\ImageUploadException; diff --git a/app/Http/Controllers/BookExportController.php b/app/Http/Controllers/BookExportController.php index 9cd156ab9..de79d544b 100644 --- a/app/Http/Controllers/BookExportController.php +++ b/app/Http/Controllers/BookExportController.php @@ -2,7 +2,7 @@ namespace BookStack\Http\Controllers; -use BookStack\Entities\ExportService; +use BookStack\Entities\Tools\ExportFormatter; use BookStack\Entities\Repos\BookRepo; use Throwable; @@ -15,7 +15,7 @@ class BookExportController extends Controller /** * BookExportController constructor. */ - public function __construct(BookRepo $bookRepo, ExportService $exportService) + public function __construct(BookRepo $bookRepo, ExportFormatter $exportService) { $this->bookRepo = $bookRepo; $this->exportService = $exportService; diff --git a/app/Http/Controllers/BookSortController.php b/app/Http/Controllers/BookSortController.php index 7ba11aded..6d3199cbe 100644 --- a/app/Http/Controllers/BookSortController.php +++ b/app/Http/Controllers/BookSortController.php @@ -3,7 +3,7 @@ namespace BookStack\Http\Controllers; use BookStack\Actions\ActivityType; -use BookStack\Entities\Book; +use BookStack\Entities\Models\Book; use BookStack\Entities\Tools\BookContents; use BookStack\Entities\Repos\BookRepo; use BookStack\Exceptions\SortOperationException; diff --git a/app/Http/Controllers/BookshelfController.php b/app/Http/Controllers/BookshelfController.php index 52de74b66..50dc97bab 100644 --- a/app/Http/Controllers/BookshelfController.php +++ b/app/Http/Controllers/BookshelfController.php @@ -1,7 +1,7 @@ chapterRepo = $chapterRepo; $this->exportService = $exportService; diff --git a/app/Http/Controllers/CommentController.php b/app/Http/Controllers/CommentController.php index f8586e269..bf1a76f51 100644 --- a/app/Http/Controllers/CommentController.php +++ b/app/Http/Controllers/CommentController.php @@ -3,7 +3,7 @@ use Activity; use BookStack\Actions\ActivityType; use BookStack\Actions\CommentRepo; -use BookStack\Entities\Page; +use BookStack\Entities\Models\Page; use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index fb3ba8e85..c6856d339 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -1,9 +1,9 @@ pageRepo = $pageRepo; $this->exportService = $exportService; diff --git a/app/Http/Controllers/RecycleBinController.php b/app/Http/Controllers/RecycleBinController.php index ebf9bd16c..a644a2889 100644 --- a/app/Http/Controllers/RecycleBinController.php +++ b/app/Http/Controllers/RecycleBinController.php @@ -1,7 +1,7 @@ viewService = $viewService; - $this->searchService = $searchService; + $this->searchRunner = $searchRunner; $this->entityContextManager = $entityContextManager; } @@ -40,7 +37,7 @@ class SearchController extends Controller $page = intval($request->get('page', '0')) ?: 1; $nextPageLink = url('/search?term=' . urlencode($fullSearchString) . '&page=' . ($page+1)); - $results = $this->searchService->searchEntities($searchOpts, 'all', $page, 20); + $results = $this->searchRunner->searchEntities($searchOpts, 'all', $page, 20); return view('search.all', [ 'entities' => $results['results'], @@ -52,14 +49,13 @@ class SearchController extends Controller ]); } - /** * Searches all entities within a book. */ public function searchBook(Request $request, int $bookId) { $term = $request->get('term', ''); - $results = $this->searchService->searchBook($bookId, $term); + $results = $this->searchRunner->searchBook($bookId, $term); return view('partials.entity-list', ['entities' => $results]); } @@ -69,7 +65,7 @@ class SearchController extends Controller public function searchChapter(Request $request, int $chapterId) { $term = $request->get('term', ''); - $results = $this->searchService->searchChapter($chapterId, $term); + $results = $this->searchRunner->searchChapter($chapterId, $term); return view('partials.entity-list', ['entities' => $results]); } @@ -86,7 +82,7 @@ class SearchController extends Controller // Search for entities otherwise show most popular if ($searchTerm !== false) { $searchTerm .= ' {type:'. implode('|', $entityTypes) .'}'; - $entities = $this->searchService->searchEntities(SearchOptions::fromString($searchTerm), 'all', 1, 20, $permission)['results']; + $entities = $this->searchRunner->searchEntities(SearchOptions::fromString($searchTerm), 'all', 1, 20, $permission)['results']; } else { $entities = $this->viewService->getPopular(20, 0, $entityTypes, $permission); } diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index c9bf4f36b..1c6180a1f 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -1,11 +1,11 @@ define(\BookStack\Auth\User::class, function ($faker) { ]; }); -$factory->define(\BookStack\Entities\Bookshelf::class, function ($faker) { +$factory->define(\BookStack\Entities\Models\Bookshelf::class, function ($faker) { return [ 'name' => $faker->sentence, 'slug' => Str::random(10), @@ -29,7 +29,7 @@ $factory->define(\BookStack\Entities\Bookshelf::class, function ($faker) { ]; }); -$factory->define(\BookStack\Entities\Book::class, function ($faker) { +$factory->define(\BookStack\Entities\Models\Book::class, function ($faker) { return [ 'name' => $faker->sentence, 'slug' => Str::random(10), @@ -37,7 +37,7 @@ $factory->define(\BookStack\Entities\Book::class, function ($faker) { ]; }); -$factory->define(\BookStack\Entities\Chapter::class, function ($faker) { +$factory->define(\BookStack\Entities\Models\Chapter::class, function ($faker) { return [ 'name' => $faker->sentence, 'slug' => Str::random(10), @@ -45,7 +45,7 @@ $factory->define(\BookStack\Entities\Chapter::class, function ($faker) { ]; }); -$factory->define(\BookStack\Entities\Page::class, function ($faker) { +$factory->define(\BookStack\Entities\Models\Page::class, function ($faker) { $html = '
' . implode('
', $faker->paragraphs(5)) . ''; return [ 'name' => $faker->sentence, diff --git a/database/migrations/2018_08_04_115700_create_bookshelves_table.php b/database/migrations/2018_08_04_115700_create_bookshelves_table.php index eab3216bb..9efba0071 100644 --- a/database/migrations/2018_08_04_115700_create_bookshelves_table.php +++ b/database/migrations/2018_08_04_115700_create_bookshelves_table.php @@ -119,11 +119,11 @@ class CreateBookshelvesTable extends Migration Schema::dropIfExists('bookshelves'); // Drop related polymorphic items - DB::table('activities')->where('entity_type', '=', 'BookStack\Entities\Bookshelf')->delete(); - DB::table('views')->where('viewable_type', '=', 'BookStack\Entities\Bookshelf')->delete(); - DB::table('entity_permissions')->where('restrictable_type', '=', 'BookStack\Entities\Bookshelf')->delete(); - DB::table('tags')->where('entity_type', '=', 'BookStack\Entities\Bookshelf')->delete(); - DB::table('search_terms')->where('entity_type', '=', 'BookStack\Entities\Bookshelf')->delete(); - DB::table('comments')->where('entity_type', '=', 'BookStack\Entities\Bookshelf')->delete(); + DB::table('activities')->where('entity_type', '=', 'BookStack\Entities\Models\Bookshelf')->delete(); + DB::table('views')->where('viewable_type', '=', 'BookStack\Entities\Models\Bookshelf')->delete(); + DB::table('entity_permissions')->where('restrictable_type', '=', 'BookStack\Entities\Models\Bookshelf')->delete(); + DB::table('tags')->where('entity_type', '=', 'BookStack\Entities\Models\Bookshelf')->delete(); + DB::table('search_terms')->where('entity_type', '=', 'BookStack\Entities\Models\Bookshelf')->delete(); + DB::table('comments')->where('entity_type', '=', 'BookStack\Entities\Models\Bookshelf')->delete(); } } diff --git a/database/seeds/DummyContentSeeder.php b/database/seeds/DummyContentSeeder.php index 6d902a196..55e1f1075 100644 --- a/database/seeds/DummyContentSeeder.php +++ b/database/seeds/DummyContentSeeder.php @@ -5,10 +5,10 @@ use BookStack\Auth\Permissions\PermissionService; use BookStack\Auth\Permissions\RolePermission; use BookStack\Auth\Role; use BookStack\Auth\User; -use BookStack\Entities\Bookshelf; -use BookStack\Entities\Chapter; -use BookStack\Entities\Page; -use BookStack\Entities\SearchService; +use BookStack\Entities\Models\Bookshelf; +use BookStack\Entities\Models\Chapter; +use BookStack\Entities\Models\Page; +use BookStack\Entities\Tools\SearchIndex; use Illuminate\Database\Seeder; use Illuminate\Support\Str; @@ -33,7 +33,7 @@ class DummyContentSeeder extends Seeder $byData = ['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]; - factory(\BookStack\Entities\Book::class, 5)->create($byData) + factory(\BookStack\Entities\Models\Book::class, 5)->create($byData) ->each(function($book) use ($editorUser, $byData) { $chapters = factory(Chapter::class, 3)->create($byData) ->each(function($chapter) use ($editorUser, $book, $byData){ @@ -45,7 +45,7 @@ class DummyContentSeeder extends Seeder $book->pages()->saveMany($pages); }); - $largeBook = factory(\BookStack\Entities\Book::class)->create(array_merge($byData, ['name' => 'Large book' . Str::random(10)])); + $largeBook = factory(\BookStack\Entities\Models\Book::class)->create(array_merge($byData, ['name' => 'Large book' . Str::random(10)])); $pages = factory(Page::class, 200)->make($byData); $chapters = factory(Chapter::class, 50)->make($byData); $largeBook->pages()->saveMany($pages); @@ -67,6 +67,6 @@ class DummyContentSeeder extends Seeder $token->save(); app(PermissionService::class)->buildJointPermissions(); - app(SearchService::class)->indexAllEntities(); + app(SearchIndex::class)->indexAllEntities(); } } diff --git a/database/seeds/LargeContentSeeder.php b/database/seeds/LargeContentSeeder.php index 4db10395a..535626b8f 100644 --- a/database/seeds/LargeContentSeeder.php +++ b/database/seeds/LargeContentSeeder.php @@ -3,9 +3,9 @@ use BookStack\Auth\Permissions\PermissionService; use BookStack\Auth\Role; use BookStack\Auth\User; -use BookStack\Entities\Chapter; -use BookStack\Entities\Page; -use BookStack\Entities\SearchService; +use BookStack\Entities\Models\Chapter; +use BookStack\Entities\Models\Page; +use BookStack\Entities\Tools\SearchIndex; use Illuminate\Database\Seeder; use Illuminate\Support\Str; @@ -23,12 +23,12 @@ class LargeContentSeeder extends Seeder $editorRole = Role::getRole('editor'); $editorUser->attachRole($editorRole); - $largeBook = factory(\BookStack\Entities\Book::class)->create(['name' => 'Large book' . Str::random(10), 'created_by' => $editorUser->id, 'updated_by' => $editorUser->id]); + $largeBook = factory(\BookStack\Entities\Models\Book::class)->create(['name' => 'Large book' . Str::random(10), 'created_by' => $editorUser->id, 'updated_by' => $editorUser->id]); $pages = factory(Page::class, 200)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]); $chapters = factory(Chapter::class, 50)->make(['created_by' => $editorUser->id, 'updated_by' => $editorUser->id]); $largeBook->pages()->saveMany($pages); $largeBook->chapters()->saveMany($chapters); app(PermissionService::class)->buildJointPermissions(); - app(SearchService::class)->indexAllEntities(); + app(SearchIndex::class)->indexAllEntities(); } } diff --git a/resources/views/common/header.blade.php b/resources/views/common/header.blade.php index 827abcac6..80e79410a 100644 --- a/resources/views/common/header.blade.php +++ b/resources/views/common/header.blade.php @@ -29,7 +29,7 @@test message content
'; $this->asAdmin()->visit($this->page->getUrl('/edit')) ->dontSeeInField('html', $addedContent); @@ -75,7 +75,7 @@ class PageDraftTest extends BrowserKitTest public function test_draft_pages_show_on_homepage() { - $book = \BookStack\Entities\Book::first(); + $book = \BookStack\Entities\Models\Book::first(); $this->asAdmin()->visit('/') ->dontSeeInElement('#recent-drafts', 'New Page') ->visit($book->getUrl() . '/create-page') @@ -85,7 +85,7 @@ class PageDraftTest extends BrowserKitTest public function test_draft_pages_not_visible_by_others() { - $book = \BookStack\Entities\Book::first(); + $book = \BookStack\Entities\Models\Book::first(); $chapter = $book->chapters->first(); $newUser = $this->getEditor(); diff --git a/tests/Entity/PageRevisionTest.php b/tests/Entity/PageRevisionTest.php index 1e9dbd626..6eaea129c 100644 --- a/tests/Entity/PageRevisionTest.php +++ b/tests/Entity/PageRevisionTest.php @@ -1,6 +1,6 @@