From ef1b98019a0c3f123b0add8428292807eac3fe05 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Sun, 22 Nov 2020 00:17:45 +0000 Subject: [PATCH] Fixed some mis-refactoring and split search service Search service broken into index and runner tools. --- app/Actions/Activity.php | 2 +- app/Actions/ActivityService.php | 6 +- app/Actions/CommentRepo.php | 2 +- app/Actions/TagRepo.php | 2 +- app/Actions/ViewService.php | 6 +- app/Auth/Permissions/JointPermission.php | 2 +- app/Auth/Permissions/PermissionService.php | 20 +-- app/Auth/UserRepo.php | 8 +- app/Console/Commands/ClearRevisions.php | 2 +- app/Console/Commands/CopyShelfPermissions.php | 2 +- app/Console/Commands/RegenerateSearch.php | 13 +- app/Entities/BreadcrumbsViewComposer.php | 1 + app/Entities/EntityProvider.php | 7 + app/Entities/Models/Book.php | 7 +- app/Entities/Models/BookChild.php | 5 +- app/Entities/Models/Bookshelf.php | 5 +- app/Entities/Models/Chapter.php | 4 +- app/Entities/Models/Deletion.php | 3 +- app/Entities/Models/Entity.php | 14 +- app/Entities/Models/HasCoverImage.php | 2 +- app/Entities/Models/Page.php | 5 +- app/Entities/Models/PageRevision.php | 3 +- app/Entities/Models/SearchTerm.php | 2 +- app/Entities/Repos/BaseRepo.php | 4 +- app/Entities/Repos/BookRepo.php | 2 +- app/Entities/Repos/BookshelfRepo.php | 4 +- app/Entities/Repos/ChapterRepo.php | 4 +- app/Entities/Repos/PageRepo.php | 10 +- app/Entities/Tools/BookContents.php | 10 +- .../ExportFormatter.php} | 9 +- app/Entities/Tools/PageContent.php | 2 +- app/Entities/Tools/PageEditActivity.php | 4 +- app/Entities/Tools/SearchIndex.php | 119 ++++++++++++++ app/Entities/Tools/SearchOptions.php | 2 +- .../SearchRunner.php} | 146 ++---------------- app/Entities/Tools/ShelfContext.php | 4 +- app/Entities/Tools/SlugGenerator.php | 3 +- app/Entities/Tools/TrashCan.php | 14 +- .../Controllers/Api/BookApiController.php | 10 +- .../Api/BookExportApiController.php | 6 +- .../Api/BookshelfApiController.php | 2 +- .../Controllers/Api/ChapterApiController.php | 4 +- .../Api/ChapterExportApiController.php | 6 +- app/Http/Controllers/BookController.php | 2 +- app/Http/Controllers/BookExportController.php | 4 +- app/Http/Controllers/BookSortController.php | 2 +- app/Http/Controllers/BookshelfController.php | 2 +- app/Http/Controllers/ChapterController.php | 2 +- .../Controllers/ChapterExportController.php | 4 +- app/Http/Controllers/CommentController.php | 2 +- app/Http/Controllers/HomeController.php | 4 +- app/Http/Controllers/PageController.php | 2 +- app/Http/Controllers/PageExportController.php | 4 +- app/Http/Controllers/RecycleBinController.php | 2 +- app/Http/Controllers/SearchController.php | 28 ++-- app/Providers/AppServiceProvider.php | 8 +- app/Uploads/Attachment.php | 2 +- app/Uploads/Image.php | 2 +- app/Uploads/ImageRepo.php | 2 +- database/factories/ModelFactory.php | 8 +- ..._08_04_115700_create_bookshelves_table.php | 12 +- database/seeds/DummyContentSeeder.php | 14 +- database/seeds/LargeContentSeeder.php | 10 +- resources/views/common/header.blade.php | 2 +- .../views/components/page-picker.blade.php | 2 +- .../views/partials/breadcrumbs.blade.php | 6 +- .../settings/recycle-bin/destroy.blade.php | 2 +- .../settings/recycle-bin/index.blade.php | 6 +- .../settings/recycle-bin/restore.blade.php | 2 +- tests/ActivityTrackingTest.php | 2 +- tests/Api/ApiListingTest.php | 2 +- tests/Api/BooksApiTest.php | 2 +- tests/Api/ChaptersApiTest.php | 4 +- tests/Api/ShelvesApiTest.php | 4 +- tests/AuditLogTest.php | 2 +- tests/Auth/AuthTest.php | 2 +- tests/BrowserKitTest.php | 8 +- tests/CommandsTest.php | 4 +- tests/Entity/BookShelfTest.php | 4 +- tests/Entity/BookTest.php | 2 +- tests/Entity/ChapterTest.php | 2 +- tests/Entity/CommentSettingTest.php | 2 +- tests/Entity/CommentTest.php | 2 +- tests/Entity/EntitySearchTest.php | 8 +- tests/Entity/EntityTest.php | 8 +- tests/Entity/ExportTest.php | 4 +- tests/Entity/MarkdownTest.php | 2 +- tests/Entity/PageContentTest.php | 2 +- tests/Entity/PageDraftTest.php | 10 +- tests/Entity/PageRevisionTest.php | 2 +- tests/Entity/PageTemplateTest.php | 2 +- tests/Entity/PageTest.php | 2 +- tests/Entity/SearchOptionsTest.php | 2 +- tests/Entity/SortTest.php | 6 +- tests/Entity/TagTest.php | 8 +- tests/ErrorTest.php | 2 +- tests/HomepageTest.php | 2 +- tests/Permissions/RestrictionsTest.php | 10 +- tests/Permissions/RolesTest.php | 8 +- tests/PublicActionTest.php | 6 +- tests/RecycleBinTest.php | 6 +- tests/SharedTestHelpers.php | 10 +- tests/TestCase.php | 2 +- tests/Uploads/AttachmentTest.php | 2 +- tests/Uploads/DrawioTest.php | 2 +- tests/Uploads/ImageTest.php | 2 +- tests/Uploads/UsesImages.php | 2 +- tests/User/UserProfileTest.php | 2 +- 108 files changed, 399 insertions(+), 379 deletions(-) rename app/Entities/{ExportService.php => Tools/ExportFormatter.php} (97%) create mode 100644 app/Entities/Tools/SearchIndex.php rename app/Entities/{SearchService.php => Tools/SearchRunner.php} (72%) 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 @@ - @if($deletion->deletable instanceof \BookStack\Entities\Book || $deletion->deletable instanceof \BookStack\Entities\Chapter) + @if($deletion->deletable instanceof \BookStack\Entities\Models\Book || $deletion->deletable instanceof \BookStack\Entities\Models\Chapter)
@endif - @if($deletion->deletable instanceof \BookStack\Entities\Book) + @if($deletion->deletable instanceof \BookStack\Entities\Models\Book)
@icon('chapter') {{ trans_choice('entities.x_chapters', $deletion->deletable->chapters()->withTrashed()->count()) }}
@endif - @if($deletion->deletable instanceof \BookStack\Entities\Book || $deletion->deletable instanceof \BookStack\Entities\Chapter) + @if($deletion->deletable instanceof \BookStack\Entities\Models\Book || $deletion->deletable instanceof \BookStack\Entities\Models\Chapter)
@icon('page') {{ trans_choice('entities.x_pages', $deletion->deletable->pages()->withTrashed()->count()) }} diff --git a/resources/views/settings/recycle-bin/restore.blade.php b/resources/views/settings/recycle-bin/restore.blade.php index 79ccf1b7d..62a31e5cc 100644 --- a/resources/views/settings/recycle-bin/restore.blade.php +++ b/resources/views/settings/recycle-bin/restore.blade.php @@ -18,7 +18,7 @@ - @if($deletion->deletable instanceof \BookStack\Entities\Entity) + @if($deletion->deletable instanceof \BookStack\Entities\Models\Entity)
{{ trans('settings.recycle_bin_restore_list') }}
@if($deletion->deletable->getParent() && $deletion->deletable->getParent()->trashed()) diff --git a/tests/ActivityTrackingTest.php b/tests/ActivityTrackingTest.php index f47bc44a3..9c3fe273c 100644 --- a/tests/ActivityTrackingTest.php +++ b/tests/ActivityTrackingTest.php @@ -1,7 +1,7 @@ create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id]); - $chapter = factory(\BookStack\Entities\Chapter::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id, 'book_id' => $book->id]); - $page = factory(\BookStack\Entities\Page::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id, 'book_id' => $book->id, 'chapter_id' => $chapter->id]); + $book = factory(\BookStack\Entities\Models\Book::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id]); + $chapter = factory(\BookStack\Entities\Models\Chapter::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id, 'book_id' => $book->id]); + $page = factory(\BookStack\Entities\Models\Page::class)->create(['created_by' => $creatorUser->id, 'updated_by' => $updaterUser->id, 'book_id' => $book->id, 'chapter_id' => $chapter->id]); $restrictionService = $this->app[PermissionService::class]; $restrictionService->buildJointPermissionsForEntity($book); return [ diff --git a/tests/CommandsTest.php b/tests/CommandsTest.php index ca90bf055..8c6ea84bf 100644 --- a/tests/CommandsTest.php +++ b/tests/CommandsTest.php @@ -4,8 +4,8 @@ use BookStack\Actions\ActivityType; use BookStack\Actions\Comment; use BookStack\Actions\CommentRepo; use BookStack\Auth\Permissions\JointPermission; -use BookStack\Entities\Bookshelf; -use BookStack\Entities\Page; +use BookStack\Entities\Models\Bookshelf; +use BookStack\Entities\Models\Page; use BookStack\Auth\User; use BookStack\Entities\Repos\PageRepo; use Symfony\Component\Console\Exception\RuntimeException; diff --git a/tests/Entity/BookShelfTest.php b/tests/Entity/BookShelfTest.php index c1748281e..9b3290370 100644 --- a/tests/Entity/BookShelfTest.php +++ b/tests/Entity/BookShelfTest.php @@ -1,8 +1,8 @@ page = \BookStack\Entities\Page::first(); + $this->page = \BookStack\Entities\Models\Page::first(); } protected function setMarkdownEditor() diff --git a/tests/Entity/PageContentTest.php b/tests/Entity/PageContentTest.php index 6a7b58ffb..51a8568bf 100644 --- a/tests/Entity/PageContentTest.php +++ b/tests/Entity/PageContentTest.php @@ -1,7 +1,7 @@ page = \BookStack\Entities\Page::first(); + $this->page = \BookStack\Entities\Models\Page::first(); $this->pageRepo = app(PageRepo::class); } @@ -56,7 +56,7 @@ class PageDraftTest extends BrowserKitTest public function test_alert_message_shows_if_someone_else_editing() { - $nonEditedPage = \BookStack\Entities\Page::take(10)->get()->last(); + $nonEditedPage = \BookStack\Entities\Models\Page::take(10)->get()->last(); $addedContent = '

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