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 (hasAppAccess())
@icon('search'){{ trans('common.search') }}
- @if(userCanOnAny('view', \BookStack\Entities\Bookshelf::class) || userCan('bookshelf-view-all') || userCan('bookshelf-view-own'))
+ @if(userCanOnAny('view', \BookStack\Entities\Models\Bookshelf::class) || userCan('bookshelf-view-all') || userCan('bookshelf-view-own'))
@icon('bookshelf'){{ trans('entities.shelves') }}
@endif
@icon('books'){{ trans('entities.books') }}
diff --git a/resources/views/components/page-picker.blade.php b/resources/views/components/page-picker.blade.php
index e24ea49f1..c59615d92 100644
--- a/resources/views/components/page-picker.blade.php
+++ b/resources/views/components/page-picker.blade.php
@@ -3,7 +3,7 @@
diff --git a/resources/views/partials/breadcrumbs.blade.php b/resources/views/partials/breadcrumbs.blade.php
index 58ccd5125..065aa8420 100644
--- a/resources/views/partials/breadcrumbs.blade.php
+++ b/resources/views/partials/breadcrumbs.blade.php
@@ -2,7 +2,7 @@
{{-- Show top level books item --}}
- @if (count($crumbs) > 0 && ($crumbs[0] ?? null) instanceof \BookStack\Entities\Book)
+ @if (count($crumbs) > 0 && ($crumbs[0] ?? null) instanceof \BookStack\Entities\Models\Book)
@icon('books')
{{ trans('entities.books') }}
@@ -11,7 +11,7 @@
@endif
{{-- Show top level shelves item --}}
- @if (count($crumbs) > 0 && ($crumbs[0] ?? null) instanceof \BookStack\Entities\Bookshelf)
+ @if (count($crumbs) > 0 && ($crumbs[0] ?? null) instanceof \BookStack\Entities\Models\Bookshelf)
@icon('bookshelf')
{{ trans('entities.shelves') }}
@@ -20,7 +20,7 @@
@endif
@foreach($crumbs as $key => $crumb)
-
+
@if (is_null($crumb))
diff --git a/resources/views/settings/recycle-bin/destroy.blade.php b/resources/views/settings/recycle-bin/destroy.blade.php
index 2cc11dabf..d027199b2 100644
--- a/resources/views/settings/recycle-bin/destroy.blade.php
+++ b/resources/views/settings/recycle-bin/destroy.blade.php
@@ -19,7 +19,7 @@
- @if($deletion->deletable instanceof \BookStack\Entities\Entity)
+ @if($deletion->deletable instanceof \BookStack\Entities\Models\Entity)
{{ trans('settings.recycle_bin_destroy_list') }}
@include('settings.recycle-bin.deletable-entity-list', ['entity' => $deletion->deletable])
diff --git a/resources/views/settings/recycle-bin/index.blade.php b/resources/views/settings/recycle-bin/index.blade.php
index 6a61ff9fa..657b45af9 100644
--- a/resources/views/settings/recycle-bin/index.blade.php
+++ b/resources/views/settings/recycle-bin/index.blade.php
@@ -62,17 +62,17 @@
{{ $deletion->deletable->name }}
- @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 @@