diff --git a/app/Repos/BookRepo.php b/app/Repos/BookRepo.php index a11ed2763..58816d738 100644 --- a/app/Repos/BookRepo.php +++ b/app/Repos/BookRepo.php @@ -216,12 +216,10 @@ class BookRepo extends EntityRepo */ public function findSuitableSlug($name, $currentId = false) { - $originalSlug = Str::slug($name); - $slug = $originalSlug; - $count = 2; + $slug = Str::slug($name); + if ($slug === "") $slug = substr(md5(rand(1, 500)), 0, 5); while ($this->doesSlugExist($slug, $currentId)) { - $slug = $originalSlug . '-' . $count; - $count++; + $slug .= '-' . substr(md5(rand(1, 500)), 0, 3); } return $slug; } @@ -229,7 +227,7 @@ class BookRepo extends EntityRepo /** * Get all child objects of a book. * Returns a sorted collection of Pages and Chapters. - * Loads the bookslug onto child elements to prevent access database access for getting the slug. + * Loads the book slug onto child elements to prevent access database access for getting the slug. * @param Book $book * @param bool $filterDrafts * @return mixed @@ -245,7 +243,7 @@ class BookRepo extends EntityRepo $pages = $pageQuery->get(); - $chapterQuery = $book->chapters()->with(['pages' => function($query) use ($filterDrafts) { + $chapterQuery = $book->chapters()->with(['pages' => function ($query) use ($filterDrafts) { $this->permissionService->enforcePageRestrictions($query, 'view'); if ($filterDrafts) $query->where('draft', '=', false); }]); @@ -263,7 +261,7 @@ class BookRepo extends EntityRepo $child->pages->each(function ($page) use ($bookSlug) { $page->setAttribute('bookSlug', $bookSlug); }); - $child->pages = $child->pages->sortBy(function($child, $key) { + $child->pages = $child->pages->sortBy(function ($child, $key) { $score = $child->priority; if ($child->draft) $score -= 100; return $score; @@ -272,7 +270,7 @@ class BookRepo extends EntityRepo }); // Sort items with drafts first then by priority. - return $children->sortBy(function($child, $key) { + return $children->sortBy(function ($child, $key) { $score = $child->priority; if ($child->isA('page') && $child->draft) $score -= 100; return $score; diff --git a/app/Repos/ChapterRepo.php b/app/Repos/ChapterRepo.php index 3c518bde9..1a8cbdf0f 100644 --- a/app/Repos/ChapterRepo.php +++ b/app/Repos/ChapterRepo.php @@ -81,7 +81,7 @@ class ChapterRepo extends EntityRepo { $pages = $this->permissionService->enforcePageRestrictions($chapter->pages())->get(); // Sort items with drafts first then by priority. - return $pages->sortBy(function($child, $key) { + return $pages->sortBy(function ($child, $key) { $score = $child->priority; if ($child->draft) $score -= 100; return $score; @@ -151,6 +151,7 @@ class ChapterRepo extends EntityRepo public function findSuitableSlug($name, $bookId, $currentId = false) { $slug = Str::slug($name); + if ($slug === "") $slug = substr(md5(rand(1, 500)), 0, 5); while ($this->doesSlugExist($slug, $bookId, $currentId)) { $slug .= '-' . substr(md5(rand(1, 500)), 0, 3); } diff --git a/app/Repos/PageRepo.php b/app/Repos/PageRepo.php index de050e1c7..3698e5efb 100644 --- a/app/Repos/PageRepo.php +++ b/app/Repos/PageRepo.php @@ -147,7 +147,7 @@ class PageRepo extends EntityRepo $draftPage->fill($input); // Save page tags if present - if(isset($input['tags'])) { + if (isset($input['tags'])) { $this->tagRepo->saveTagsToEntity($draftPage, $input['tags']); } @@ -319,7 +319,7 @@ class PageRepo extends EntityRepo } // Save page tags if present - if(isset($input['tags'])) { + if (isset($input['tags'])) { $this->tagRepo->saveTagsToEntity($page, $input['tags']); } @@ -405,7 +405,7 @@ class PageRepo extends EntityRepo $draft->fill($data); if (setting('app-editor') !== 'markdown') $draft->markdown = ''; - + $draft->save(); return $draft; } @@ -591,14 +591,15 @@ class PageRepo extends EntityRepo /** * Gets a suitable slug for the resource - * @param $name - * @param $bookId + * @param string $name + * @param int $bookId * @param bool|false $currentId * @return string */ public function findSuitableSlug($name, $bookId, $currentId = false) { $slug = Str::slug($name); + if ($slug === "") $slug = substr(md5(rand(1, 500)), 0, 5); while ($this->doesSlugExist($slug, $bookId, $currentId)) { $slug .= '-' . substr(md5(rand(1, 500)), 0, 3); } diff --git a/tests/Entity/EntityTest.php b/tests/Entity/EntityTest.php index 3bf6a3f2a..71d83dd47 100644 --- a/tests/Entity/EntityTest.php +++ b/tests/Entity/EntityTest.php @@ -151,8 +151,10 @@ class EntityTest extends TestCase ->visit('/books/create') ->type($book->name, '#name') ->type($book->description, '#description') - ->press('Save Book') - ->seePageIs('/books/my-first-book-2'); + ->press('Save Book'); + + $expectedPattern = '/\/books\/my-first-book-[0-9a-zA-Z]{3}/'; + $this->assertRegExp($expectedPattern, $this->currentUri, "Did not land on expected page [$expectedPattern].\n"); $book = \BookStack\Book::where('slug', '=', 'my-first-book')->first(); return $book;