]> BookStack Code Mirror - bookstack/commitdiff
Fixed entities created with blank slugs.
authorDan Brown <redacted>
Sat, 13 Aug 2016 12:53:04 +0000 (13:53 +0100)
committerDan Brown <redacted>
Sat, 13 Aug 2016 12:53:04 +0000 (13:53 +0100)
Fixes #156.

app/Repos/BookRepo.php
app/Repos/ChapterRepo.php
app/Repos/PageRepo.php
tests/Entity/EntityTest.php

index a11ed2763c9ce51ad7efc23d1678e1f06eeb9af1..58816d738578a8c1e6d784a48b6159dc7633a514 100644 (file)
@@ -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;
index 3c518bde9de3f01a0c6a056ffdcc50cb5f27c772..1a8cbdf0fdada690eae187ad5a6c9db4fd5e37ba 100644 (file)
@@ -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);
         }
index de050e1c7cb8ad245157f81316c6305c2fdff87a..3698e5efb925994a547b0252d3850369b639ca18 100644 (file)
@@ -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);
         }
index 3bf6a3f2ac76ed88b56739a3459210c367c818ed..71d83dd47237efaedd2830af575f8c0f445fe78a 100644 (file)
@@ -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;
Morty Proxy This is a proxified and sanitized view of the page, visit original site.