diff --git a/app/Entities/Repos/BaseRepo.php b/app/Entities/Repos/BaseRepo.php index 6b29dad7b..9e1b41672 100644 --- a/app/Entities/Repos/BaseRepo.php +++ b/app/Entities/Repos/BaseRepo.php @@ -11,8 +11,8 @@ use Illuminate\Http\UploadedFile; class BaseRepo { - protected $tagRepo; - protected $imageRepo; + protected TagRepo $tagRepo; + protected ImageRepo $imageRepo; public function __construct(TagRepo $tagRepo, ImageRepo $imageRepo) { @@ -58,6 +58,7 @@ class BaseRepo if (isset($input['tags'])) { $this->tagRepo->saveTagsToEntity($entity, $input['tags']); + $entity->touch(); } $entity->rebuildPermissions(); diff --git a/app/Http/Controllers/Api/BookshelfApiController.php b/app/Http/Controllers/Api/BookshelfApiController.php index bd4f23a10..63275a72a 100644 --- a/app/Http/Controllers/Api/BookshelfApiController.php +++ b/app/Http/Controllers/Api/BookshelfApiController.php @@ -11,21 +11,20 @@ use Illuminate\Validation\ValidationException; class BookshelfApiController extends ApiController { - /** - * @var BookshelfRepo - */ - protected $bookshelfRepo; + protected BookshelfRepo $bookshelfRepo; protected $rules = [ 'create' => [ 'name' => ['required', 'string', 'max:255'], 'description' => ['string', 'max:1000'], 'books' => ['array'], + 'tags' => ['array'], ], 'update' => [ 'name' => ['string', 'min:1', 'max:255'], 'description' => ['string', 'max:1000'], 'books' => ['array'], + 'tags' => ['array'], ], ]; diff --git a/app/Http/Controllers/Api/PageApiController.php b/app/Http/Controllers/Api/PageApiController.php index 6f3a71e02..9749985a5 100644 --- a/app/Http/Controllers/Api/PageApiController.php +++ b/app/Http/Controllers/Api/PageApiController.php @@ -12,7 +12,7 @@ use Illuminate\Http\Request; class PageApiController extends ApiController { - protected $pageRepo; + protected PageRepo $pageRepo; protected $rules = [ 'create' => [ @@ -24,8 +24,8 @@ class PageApiController extends ApiController 'tags' => ['array'], ], 'update' => [ - 'book_id' => ['required', 'integer'], - 'chapter_id' => ['required', 'integer'], + 'book_id' => ['integer'], + 'chapter_id' => ['integer'], 'name' => ['string', 'min:1', 'max:255'], 'html' => ['string'], 'markdown' => ['string'], @@ -103,6 +103,8 @@ class PageApiController extends ApiController */ public function update(Request $request, string $id) { + $requestData = $this->validate($request, $this->rules['update']); + $page = $this->pageRepo->getById($id, []); $this->checkOwnablePermission('page-update', $page); @@ -127,7 +129,7 @@ class PageApiController extends ApiController } } - $updatedPage = $this->pageRepo->update($page, $request->all()); + $updatedPage = $this->pageRepo->update($page, $requestData); return response()->json($updatedPage->forJsonDisplay()); } diff --git a/tests/Api/BooksApiTest.php b/tests/Api/BooksApiTest.php index 91e2db9e5..9625c9f2d 100644 --- a/tests/Api/BooksApiTest.php +++ b/tests/Api/BooksApiTest.php @@ -3,13 +3,15 @@ namespace Tests\Api; use BookStack\Entities\Models\Book; +use Carbon\Carbon; +use Illuminate\Support\Facades\DB; use Tests\TestCase; class BooksApiTest extends TestCase { use TestsApi; - protected $baseEndpoint = '/api/books'; + protected string $baseEndpoint = '/api/books'; public function test_index_endpoint_returns_expected_book() { @@ -101,6 +103,21 @@ class BooksApiTest extends TestCase $this->assertActivityExists('book_update', $book); } + public function test_update_increments_updated_date_if_only_tags_are_sent() + { + $this->actingAsApiEditor(); + $book = Book::visible()->first(); + DB::table('books')->where('id', '=', $book->id)->update(['updated_at' => Carbon::now()->subWeek()]); + + $details = [ + 'tags' => [['name' => 'Category', 'value' => 'Testing']] + ]; + + $this->putJson($this->baseEndpoint . "/{$book->id}", $details); + $book->refresh(); + $this->assertGreaterThan(Carbon::now()->subDay()->unix(), $book->updated_at->unix()); + } + public function test_delete_endpoint() { $this->actingAsApiEditor(); diff --git a/tests/Api/ChaptersApiTest.php b/tests/Api/ChaptersApiTest.php index c9ed1a289..6f00f9ead 100644 --- a/tests/Api/ChaptersApiTest.php +++ b/tests/Api/ChaptersApiTest.php @@ -4,13 +4,15 @@ namespace Tests\Api; use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Chapter; +use Carbon\Carbon; +use Illuminate\Support\Facades\DB; use Tests\TestCase; class ChaptersApiTest extends TestCase { use TestsApi; - protected $baseEndpoint = '/api/chapters'; + protected string $baseEndpoint = '/api/chapters'; public function test_index_endpoint_returns_expected_chapter() { @@ -147,6 +149,21 @@ class ChaptersApiTest extends TestCase $this->assertActivityExists('chapter_update', $chapter); } + public function test_update_increments_updated_date_if_only_tags_are_sent() + { + $this->actingAsApiEditor(); + $chapter = Chapter::visible()->first(); + DB::table('chapters')->where('id', '=', $chapter->id)->update(['updated_at' => Carbon::now()->subWeek()]); + + $details = [ + 'tags' => [['name' => 'Category', 'value' => 'Testing']] + ]; + + $this->putJson($this->baseEndpoint . "/{$chapter->id}", $details); + $chapter->refresh(); + $this->assertGreaterThan(Carbon::now()->subDay()->unix(), $chapter->updated_at->unix()); + } + public function test_delete_endpoint() { $this->actingAsApiEditor(); diff --git a/tests/Api/PagesApiTest.php b/tests/Api/PagesApiTest.php index 4eb109d9d..b91d96d89 100644 --- a/tests/Api/PagesApiTest.php +++ b/tests/Api/PagesApiTest.php @@ -5,13 +5,15 @@ namespace Tests\Api; use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Chapter; use BookStack\Entities\Models\Page; +use Carbon\Carbon; +use Illuminate\Support\Facades\DB; use Tests\TestCase; class PagesApiTest extends TestCase { use TestsApi; - protected $baseEndpoint = '/api/pages'; + protected string $baseEndpoint = '/api/pages'; public function test_index_endpoint_returns_expected_page() { @@ -240,6 +242,21 @@ class PagesApiTest extends TestCase $this->assertEquals($originalContent, $page->html); } + public function test_update_increments_updated_date_if_only_tags_are_sent() + { + $this->actingAsApiEditor(); + $page = Page::visible()->first(); + DB::table('pages')->where('id', '=', $page->id)->update(['updated_at' => Carbon::now()->subWeek()]); + + $details = [ + 'tags' => [['name' => 'Category', 'value' => 'Testing']] + ]; + + $this->putJson($this->baseEndpoint . "/{$page->id}", $details); + $page->refresh(); + $this->assertGreaterThan(Carbon::now()->subDay()->unix(), $page->updated_at->unix()); + } + public function test_delete_endpoint() { $this->actingAsApiEditor(); diff --git a/tests/Api/ShelvesApiTest.php b/tests/Api/ShelvesApiTest.php index 8868c686e..5953b0c0d 100644 --- a/tests/Api/ShelvesApiTest.php +++ b/tests/Api/ShelvesApiTest.php @@ -4,13 +4,15 @@ namespace Tests\Api; use BookStack\Entities\Models\Book; use BookStack\Entities\Models\Bookshelf; +use Carbon\Carbon; +use Illuminate\Support\Facades\DB; use Tests\TestCase; class ShelvesApiTest extends TestCase { use TestsApi; - protected $baseEndpoint = '/api/shelves'; + protected string $baseEndpoint = '/api/shelves'; public function test_index_endpoint_returns_expected_shelf() { @@ -111,6 +113,21 @@ class ShelvesApiTest extends TestCase $this->assertActivityExists('bookshelf_update', $shelf); } + public function test_update_increments_updated_date_if_only_tags_are_sent() + { + $this->actingAsApiEditor(); + $shelf = Bookshelf::visible()->first(); + DB::table('bookshelves')->where('id', '=', $shelf->id)->update(['updated_at' => Carbon::now()->subWeek()]); + + $details = [ + 'tags' => [['name' => 'Category', 'value' => 'Testing']] + ]; + + $this->putJson($this->baseEndpoint . "/{$shelf->id}", $details); + $shelf->refresh(); + $this->assertGreaterThan(Carbon::now()->subDay()->unix(), $shelf->updated_at->unix()); + } + public function test_update_only_assigns_books_if_param_provided() { $this->actingAsApiEditor();