]> BookStack Code Mirror - bookstack/commitdiff
Updated create routes to prevent slug clashes
authorDan Brown <redacted>
Sun, 25 Mar 2018 10:34:42 +0000 (11:34 +0100)
committerDan Brown <redacted>
Sun, 25 Mar 2018 10:34:42 +0000 (11:34 +0100)
Fixes #758

resources/views/books/create.blade.php
resources/views/books/index.blade.php
resources/views/books/show.blade.php
resources/views/chapters/create.blade.php
resources/views/chapters/form.blade.php
resources/views/pages/guest-create.blade.php
routes/web.php
tests/Entity/EntityTest.php
tests/Entity/PageDraftTest.php
tests/Permissions/RestrictionsTest.php
tests/Permissions/RolesTest.php

index eb0664ad84271cdf87cd03da98e09b26cdfdb814..a86cb33523a323e0d9f57822b37894af54eeb173 100644 (file)
@@ -5,7 +5,7 @@
         <div class="breadcrumbs">
             <a href="{{ baseUrl('/books') }}" class="text-button">@icon('book'){{ trans('entities.books') }}</a>
             <span class="sep">&raquo;</span>
-            <a href="{{ baseUrl('/books/create') }}" class="text-button">@icon('add'){{ trans('entities.books_create') }}</a>
+            <a href="{{ baseUrl('/create-book') }}" class="text-button">@icon('add'){{ trans('entities.books_create') }}</a>
         </div>
     </div>
 @stop
index d66612f626db530d02c8622a67a44d6cc432eef0..d1435ab662969c5f9128c6dc7d3d6dae9aae311f 100644 (file)
@@ -18,7 +18,7 @@
     <div class="col-xs-6 faded">
         <div class="action-buttons">
             @if($currentUser->can('book-create-all'))
-                <a href="{{ baseUrl("/books/create") }}" class="text-pos text-button">@icon('add'){{ trans('entities.books_create') }}</a>
+                <a href="{{ baseUrl("/create-book") }}" class="text-pos text-button">@icon('add'){{ trans('entities.books_create') }}</a>
             @endif
         </div>
     </div>
@@ -78,7 +78,7 @@
         @else
             <p class="text-muted">{{ trans('entities.books_empty') }}</p>
             @if(userCan('books-create-all'))
-                <a href="{{ baseUrl("/books/create") }}" class="text-pos">@icon('edit'){{ trans('entities.create_one_now') }}</a>
+                <a href="{{ baseUrl("/create-book") }}" class="text-pos">@icon('edit'){{ trans('entities.create_one_now') }}</a>
             @endif
         @endif
     </div>
index bb5189187bbfb112fe031f0b3a033b334f27e00d..d3a51cb3ac637a9523dd4c3c1f6bcbede1dded63 100644 (file)
                 </ul>
             </span>
             @if(userCan('page-create', $book))
-                <a href="{{ $book->getUrl('/page/create') }}" class="text-pos text-button">@icon('add'){{ trans('entities.pages_new') }}</a>
+                <a href="{{ $book->getUrl('/create-page') }}" class="text-pos text-button">@icon('add'){{ trans('entities.pages_new') }}</a>
             @endif
             @if(userCan('chapter-create', $book))
-                <a href="{{ $book->getUrl('/chapter/create') }}" class="text-pos text-button">@icon('add'){{ trans('entities.chapters_new') }}</a>
+                <a href="{{ $book->getUrl('/create-chapter') }}" class="text-pos text-button">@icon('add'){{ trans('entities.chapters_new') }}</a>
             @endif
             @if(userCan('book-update', $book) || userCan('restrictions-manage', $book) || userCan('book-delete', $book))
                 <div dropdown class="dropdown-container">
                 <div class="well">
                     <p class="text-muted italic">{{ trans('entities.books_empty_contents') }}</p>
                         @if(userCan('page-create', $book))
-                            <a href="{{ $book->getUrl('/page/create') }}" class="button outline page">@icon('page'){{ trans('entities.books_empty_create_page') }}</a>
+                            <a href="{{ $book->getUrl('/create-page') }}" class="button outline page">@icon('page'){{ trans('entities.books_empty_create_page') }}</a>
                         @endif
                         @if(userCan('page-create', $book) && userCan('chapter-create', $book))
                             &nbsp;&nbsp;<em class="text-muted">-{{ trans('entities.books_empty_or') }}-</em>&nbsp;&nbsp;&nbsp;
                         @endif
                         @if(userCan('chapter-create', $book))
-                            <a href="{{ $book->getUrl('/chapter/create') }}" class="button outline chapter">@icon('chapter'){{ trans('entities.books_empty_add_chapter') }}</a>
+                            <a href="{{ $book->getUrl('/create-chapter') }}" class="button outline chapter">@icon('chapter'){{ trans('entities.books_empty_add_chapter') }}</a>
                         @endif
                 </div>
             @endif
index 37f4ff63373c47dbabfbb5cea2eac806a1b16586..9930da605a4eaaf9583a6e881abfe8cb9c7c17ce 100644 (file)
@@ -3,9 +3,9 @@
 @section('toolbar')
     <div class="col-sm-12 faded">
         <div class="breadcrumbs">
-            <a href="{{$book->getUrl()}}" class="text-book text-button">@icon('book'){{ $book->getShortName() }}</a>
+            <a href="{{ $book->getUrl() }}" class="text-book text-button">@icon('book'){{ $book->getShortName() }}</a>
             <span class="sep">&raquo;</span>
-            <a href="{{ baseUrl('/books/chapter/create') }}" class="text-button">@icon('add'){{ trans('entities.chapters_create') }}</a>
+            <a href="{{ $book->getUrl('/create-chapter')}}" class="text-button">@icon('add'){{ trans('entities.chapters_create') }}</a>
         </div>
     </div>
 @stop
@@ -16,7 +16,7 @@
         <div class="card">
             <h3>@icon('add') {{ trans('entities.chapters_create') }}</h3>
             <div class="body">
-                <form action="{{ $book->getUrl('/chapter/create') }}" method="POST">
+                <form action="{{ $book->getUrl('/create-chapter') }}" method="POST">
                     @include('chapters/form')
                 </form>
             </div>
index 9e3b8e472685de56fe109a96cf95c10d67ad9aa8..19cf65a61f8fe47ea0ad761898791b1d1f543172 100644 (file)
@@ -12,6 +12,6 @@
 </div>
 
 <div class="form-group text-right">
-    <a href="{{ back()->getTargetUrl() }}" class="button outline">{{ trans('common.cancel') }}</a>
+    <a href="{{ isset($chapter) ? $chapter->getUrl() : $book->getUrl() }}" class="button outline">{{ trans('common.cancel') }}</a>
     <button type="submit" class="button pos">{{ trans('entities.chapters_save') }}</button>
 </div>
index 10e16cb97e3fd80f1aa3f042ae38e4f888a88e0a..c5ad8ce70f475748a6fc3f6399345a2a966344a3 100644 (file)
@@ -4,7 +4,7 @@
 
     <div class="container small" ng-non-bindable>
         <h1>{{ trans('entities.pages_new') }}</h1>
-        <form action="{{  $parent->getUrl('/page/create/guest') }}" method="POST">
+        <form action="{{  $parent->getUrl('/create-guest-page') }}" method="POST">
 
             {!! csrf_field() !!}
 
index da80125b734d0a9b478b0ab47b0d94faf8bf3a76..7a8634ca39ec659e37142aa47df38f58cb25a6ab 100644 (file)
@@ -14,11 +14,11 @@ Route::group(['middleware' => 'auth'], function () {
         Route::get('/recently-updated', 'PageController@showRecentlyUpdated');
     });
 
+    Route::get('/create-book', 'BookController@create');
     Route::group(['prefix' => 'books'], function () {
 
         // Books
         Route::get('/', 'BookController@index');
-        Route::get('/create', 'BookController@create');
         Route::post('/', 'BookController@store');
         Route::get('/{slug}/edit', 'BookController@edit');
         Route::put('/{slug}', 'BookController@update');
@@ -35,8 +35,8 @@ Route::group(['middleware' => 'auth'], function () {
         Route::get('/{bookSlug}/export/plaintext', 'BookController@exportPlainText');
 
         // Pages
-        Route::get('/{bookSlug}/page/create', 'PageController@create');
-        Route::post('/{bookSlug}/page/create/guest', 'PageController@createAsGuest');
+        Route::get('/{bookSlug}/create-page', 'PageController@create');
+        Route::post('/{bookSlug}/create-guest-page', 'PageController@createAsGuest');
         Route::get('/{bookSlug}/draft/{pageId}', 'PageController@editDraft');
         Route::post('/{bookSlug}/draft/{pageId}', 'PageController@store');
         Route::get('/{bookSlug}/page/{pageSlug}', 'PageController@show');
@@ -62,9 +62,9 @@ Route::group(['middleware' => 'auth'], function () {
 
         // Chapters
         Route::get('/{bookSlug}/chapter/{chapterSlug}/create-page', 'PageController@create');
-        Route::post('/{bookSlug}/chapter/{chapterSlug}/page/create/guest', 'PageController@createAsGuest');
-        Route::get('/{bookSlug}/chapter/create', 'ChapterController@create');
-        Route::post('/{bookSlug}/chapter/create', 'ChapterController@store');
+        Route::post('/{bookSlug}/chapter/{chapterSlug}/create-guest-page', 'PageController@createAsGuest');
+        Route::get('/{bookSlug}/create-chapter', 'ChapterController@create');
+        Route::post('/{bookSlug}/create-chapter', 'ChapterController@store');
         Route::get('/{bookSlug}/chapter/{chapterSlug}', 'ChapterController@show');
         Route::put('/{bookSlug}/chapter/{chapterSlug}', 'ChapterController@update');
         Route::get('/{bookSlug}/chapter/{chapterSlug}/move', 'ChapterController@showMove');
index 4d4e0e6cd30112721df035f16a3386b577354079..352af1e42a0efa93c97aa6ac3a70e83806881725 100644 (file)
@@ -139,7 +139,7 @@ class EntityTest extends BrowserKitTest
             // Navigate to chapter create page
             ->visit($book->getUrl())
             ->click('New Chapter')
-            ->seePageIs($book->getUrl() . '/chapter/create')
+            ->seePageIs($book->getUrl() . '/create-chapter')
             // Fill out form
             ->type($chapter->name, '#name')
             ->type($chapter->description, '#description')
@@ -161,7 +161,7 @@ class EntityTest extends BrowserKitTest
             ->visit('/books')
             // Choose to create a book
             ->click('Create New Book')
-            ->seePageIs('/books/create')
+            ->seePageIs('/create-book')
             // Fill out form & save
             ->type($book->name, '#name')
             ->type($book->description, '#description')
@@ -172,7 +172,7 @@ class EntityTest extends BrowserKitTest
 
         // Ensure duplicate names are given different slugs
         $this->asAdmin()
-            ->visit('/books/create')
+            ->visit('/create-book')
             ->type($book->name, '#name')
             ->type($book->description, '#description')
             ->press('Save Book');
index b8ac9d3aeef6d37f86022986a8371b725aa1028a..d9341ace67f406d308026edc56235f175634fa09 100644 (file)
@@ -70,7 +70,7 @@ class PageDraftTest extends BrowserKitTest
         $book = \BookStack\Book::first();
         $this->asAdmin()->visit('/')
             ->dontSeeInElement('#recent-drafts', 'New Page')
-            ->visit($book->getUrl() . '/page/create')
+            ->visit($book->getUrl() . '/create-page')
             ->visit('/')
             ->seeInElement('#recent-drafts', 'New Page');
     }
@@ -82,7 +82,7 @@ class PageDraftTest extends BrowserKitTest
         $newUser = $this->getEditor();
 
         $this->actingAs($newUser)->visit('/')
-            ->visit($book->getUrl() . '/page/create')
+            ->visit($book->getUrl() . '/create-page')
             ->visit($chapter->getUrl() . '/create-page')
             ->visit($book->getUrl())
             ->seeInElement('.page-list', 'New Page');
index 8f37b2517b9b94e317bd2b3335452db9f47c474f..433ae7ff94b4569995af23a956f686aa204a9907 100644 (file)
@@ -109,21 +109,21 @@ class RestrictionsTest extends BrowserKitTest
 
         $this->setEntityRestrictions($book, ['view', 'delete', 'update']);
 
-        $this->forceVisit($bookUrl . '/chapter/create')
+        $this->forceVisit($bookUrl . '/create-chapter')
             ->see('You do not have permission')->seePageIs('/');
-        $this->forceVisit($bookUrl . '/page/create')
+        $this->forceVisit($bookUrl . '/create-page')
             ->see('You do not have permission')->seePageIs('/');
         $this->visit($bookUrl)->dontSeeInElement('.action-buttons', 'New Page')
             ->dontSeeInElement('.action-buttons', 'New Chapter');
 
         $this->setEntityRestrictions($book, ['view', 'create']);
 
-        $this->visit($bookUrl . '/chapter/create')
+        $this->visit($bookUrl . '/create-chapter')
             ->type('test chapter', 'name')
             ->type('test description for chapter', 'description')
             ->press('Save Chapter')
             ->seePageIs($bookUrl . '/chapter/test-chapter');
-        $this->visit($bookUrl . '/page/create')
+        $this->visit($bookUrl . '/create-page')
             ->type('test page', 'name')
             ->type('test content', 'html')
             ->press('Save Page')
@@ -454,21 +454,21 @@ class RestrictionsTest extends BrowserKitTest
 
         $this->setEntityRestrictions($book, ['view', 'delete', 'update']);
 
-        $this->forceVisit($bookUrl . '/chapter/create')
+        $this->forceVisit($bookUrl . '/create-chapter')
             ->see('You do not have permission')->seePageIs('/');
-        $this->forceVisit($bookUrl . '/page/create')
+        $this->forceVisit($bookUrl . '/create-page')
             ->see('You do not have permission')->seePageIs('/');
         $this->visit($bookUrl)->dontSeeInElement('.action-buttons', 'New Page')
             ->dontSeeInElement('.action-buttons', 'New Chapter');
 
         $this->setEntityRestrictions($book, ['view', 'create']);
 
-        $this->visit($bookUrl . '/chapter/create')
+        $this->visit($bookUrl . '/create-chapter')
             ->type('test chapter', 'name')
             ->type('test description for chapter', 'description')
             ->press('Save Chapter')
             ->seePageIs($bookUrl . '/chapter/test-chapter');
-        $this->visit($bookUrl . '/page/create')
+        $this->visit($bookUrl . '/create-page')
             ->type('test page', 'name')
             ->type('test content', 'html')
             ->press('Save Page')
index bd9e01d457b45f89a756b344622d52089fc73cf6..5bc66986baee15f2d8155970193f79f1592919cc 100644 (file)
@@ -214,12 +214,12 @@ class RolesTest extends BrowserKitTest
     public function test_books_create_all_permissions()
     {
         $this->checkAccessPermission('book-create-all', [
-            '/books/create'
+            '/create-book'
         ], [
             '/books' => 'Create New Book'
         ]);
 
-        $this->visit('/books/create')
+        $this->visit('/create-book')
             ->type('test book', 'name')
             ->type('book desc', 'description')
             ->press('Save Book')
@@ -293,40 +293,38 @@ class RolesTest extends BrowserKitTest
     {
         $book = \BookStack\Book::take(1)->get()->first();
         $ownBook = $this->createEntityChainBelongingToUser($this->user)['book'];
-        $baseUrl = $ownBook->getUrl() . '/chapter';
         $this->checkAccessPermission('chapter-create-own', [
-            $baseUrl . '/create'
+            $ownBook->getUrl('/create-chapter')
         ], [
             $ownBook->getUrl() => 'New Chapter'
         ]);
 
-        $this->visit($baseUrl . '/create')
+        $this->visit($ownBook->getUrl('/create-chapter'))
             ->type('test chapter', 'name')
             ->type('chapter desc', 'description')
             ->press('Save Chapter')
-            ->seePageIs($baseUrl . '/test-chapter');
+            ->seePageIs($ownBook->getUrl('/chapter/test-chapter'));
 
         $this->visit($book->getUrl())
             ->dontSeeInElement('.action-buttons', 'New Chapter')
-            ->visit($book->getUrl() . '/chapter/create')
+            ->visit($book->getUrl('/create-chapter'))
             ->seePageIs('/');
     }
 
     public function test_chapter_create_all_permissions()
     {
         $book = \BookStack\Book::take(1)->get()->first();
-        $baseUrl = $book->getUrl() . '/chapter';
         $this->checkAccessPermission('chapter-create-all', [
-            $baseUrl . '/create'
+            $book->getUrl('/create-chapter')
         ], [
             $book->getUrl() => 'New Chapter'
         ]);
 
-        $this->visit($baseUrl . '/create')
+        $this->visit($book->getUrl('/create-chapter'))
             ->type('test chapter', 'name')
             ->type('chapter desc', 'description')
             ->press('Save Chapter')
-            ->seePageIs($baseUrl . '/test-chapter');
+            ->seePageIs($book->getUrl('/chapter/test-chapter'));
     }
 
     public function test_chapter_edit_own_permission()
@@ -403,10 +401,8 @@ class RolesTest extends BrowserKitTest
         $ownBook = $entities['book'];
         $ownChapter = $entities['chapter'];
 
-        $baseUrl = $ownBook->getUrl() . '/page';
-
-        $createUrl = $baseUrl . '/create';
-        $createUrlChapter = $ownChapter->getUrl() . '/create-page';
+        $createUrl = $ownBook->getUrl('/create-page');
+        $createUrlChapter = $ownChapter->getUrl('/create-page');
         $accessUrls = [$createUrl, $createUrlChapter];
 
         foreach ($accessUrls as $url) {
@@ -427,15 +423,15 @@ class RolesTest extends BrowserKitTest
             $this->seePageIs($expectedUrl);
         }
 
-        $this->visit($baseUrl . '/create')
+        $this->visit($createUrl)
             ->type('test page', 'name')
             ->type('page desc', 'html')
             ->press('Save Page')
-            ->seePageIs($baseUrl . '/test-page');
+            ->seePageIs($ownBook->getUrl('/page/test-page'));
 
         $this->visit($book->getUrl())
             ->dontSeeInElement('.action-buttons', 'New Page')
-            ->visit($book->getUrl() . '/page/create')
+            ->visit($book->getUrl() . '/create-page')
             ->seePageIs('/');
         $this->visit($chapter->getUrl())
             ->dontSeeInElement('.action-buttons', 'New Page')
@@ -448,9 +444,9 @@ class RolesTest extends BrowserKitTest
         $book = \BookStack\Book::take(1)->get()->first();
         $chapter = \BookStack\Chapter::take(1)->get()->first();
         $baseUrl = $book->getUrl() . '/page';
-        $createUrl = $baseUrl . '/create';
+        $createUrl = $book->getUrl('/create-page');
 
-        $createUrlChapter = $chapter->getUrl() . '/create-page';
+        $createUrlChapter = $chapter->getUrl('/create-page');
         $accessUrls = [$createUrl, $createUrlChapter];
 
         foreach ($accessUrls as $url) {
@@ -471,17 +467,17 @@ class RolesTest extends BrowserKitTest
             $this->seePageIs($expectedUrl);
         }
 
-        $this->visit($baseUrl . '/create')
+        $this->visit($createUrl)
             ->type('test page', 'name')
             ->type('page desc', 'html')
             ->press('Save Page')
-            ->seePageIs($baseUrl . '/test-page');
+            ->seePageIs($book->getUrl('/page/test-page'));
 
-        $this->visit($chapter->getUrl() . '/create-page')
+        $this->visit($chapter->getUrl('/create-page'))
             ->type('new test page', 'name')
             ->type('page desc', 'html')
             ->press('Save Page')
-            ->seePageIs($baseUrl . '/new-test-page');
+            ->seePageIs($book->getUrl('/page/new-test-page'));
     }
 
     public function test_page_edit_own_permission()