]> BookStack Code Mirror - bookstack/commitdiff
API: Reviewed changes for API priority control
authorDan Brown <redacted>
Mon, 21 Aug 2023 14:40:53 +0000 (15:40 +0100)
committerDan Brown <redacted>
Mon, 21 Aug 2023 14:42:47 +0000 (15:42 +0100)
Review of #4313
- Made constructor changes while reviewing some classes.
- Updated API examples for consistency.
- Tweaked formatting for some array changes.
- Simplified added tests.
- Tweaked chapter/page repo priority handling to be simpler.

Performed manual API endpoint testing of page/chapter create/update.

12 files changed:
app/Api/ApiEntityListFormatter.php
app/Entities/Repos/ChapterRepo.php
app/Entities/Repos/PageRepo.php
dev/api/requests/chapters-create.json
dev/api/requests/chapters-update.json
dev/api/requests/pages-create.json
dev/api/requests/pages-update.json
dev/api/responses/chapters-create.json
dev/api/responses/chapters-update.json
dev/api/responses/pages-create.json
tests/Api/ChaptersApiTest.php
tests/Api/PagesApiTest.php

index 7d00834e5d1040c47eb56abe9c123674f4e683eb..436d66d598e8f2fb86fc27622f9016900b2a7c8e 100644 (file)
@@ -10,7 +10,7 @@ class ApiEntityListFormatter
      * The list to be formatted.
      * @var Entity[]
      */
-    protected $list = [];
+    protected array $list = [];
 
     /**
      * The fields to show in the formatted data.
@@ -19,10 +19,9 @@ class ApiEntityListFormatter
      * will be used for the resultant value. A null return value will omit the property.
      * @var array<string|int, string|callable>
      */
-    protected $fields = [
-        'id', 'name', 'slug', 'book_id', 'chapter_id',
-        'draft', 'template', 'created_at', 'updated_at',
-        'priority'
+    protected array $fields = [
+        'id', 'name', 'slug', 'book_id', 'chapter_id', 'draft',
+        'template', 'priority', 'created_at', 'updated_at',
     ];
 
     public function __construct(array $list)
index dadeec7f897d41132f94741923301b16ca047810..977193d85bbd0229a2d1a1e745dbf5fd01dd4a83 100644 (file)
@@ -16,14 +16,9 @@ use Exception;
 
 class ChapterRepo
 {
-    protected $baseRepo;
-
-    /**
-     * ChapterRepo constructor.
-     */
-    public function __construct(BaseRepo $baseRepo)
-    {
-        $this->baseRepo = $baseRepo;
+    public function __construct(
+        protected BaseRepo $baseRepo
+    ) {
     }
 
     /**
@@ -49,7 +44,7 @@ class ChapterRepo
     {
         $chapter = new Chapter();
         $chapter->book_id = $parentBook->id;
-        $chapter->priority = $chapter->priority ?: (new BookContents($parentBook))->getLastPriority() + 1;
+        $chapter->priority = (new BookContents($parentBook))->getLastPriority() + 1;
         $this->baseRepo->create($chapter, $input);
         Activity::add(ActivityType::CHAPTER_CREATE, $chapter);
 
index 637f4133a9061fcc9e7c2b7583ad6aab0ab09b35..61a1db63e397dbdfa944d7a2818a37d5f2b9d296 100644 (file)
@@ -23,24 +23,12 @@ use Illuminate\Pagination\LengthAwarePaginator;
 
 class PageRepo
 {
-    protected BaseRepo $baseRepo;
-    protected RevisionRepo $revisionRepo;
-    protected ReferenceStore $referenceStore;
-    protected ReferenceUpdater $referenceUpdater;
-
-    /**
-     * PageRepo constructor.
-     */
     public function __construct(
-        BaseRepo $baseRepo,
-        RevisionRepo $revisionRepo,
-        ReferenceStore $referenceStore,
-        ReferenceUpdater $referenceUpdater
+        protected BaseRepo $baseRepo,
+        protected RevisionRepo $revisionRepo,
+        protected ReferenceStore $referenceStore,
+        protected ReferenceUpdater $referenceUpdater
     ) {
-        $this->baseRepo = $baseRepo;
-        $this->revisionRepo = $revisionRepo;
-        $this->referenceStore = $referenceStore;
-        $this->referenceUpdater = $referenceUpdater;
     }
 
     /**
@@ -159,13 +147,11 @@ class PageRepo
      */
     public function publishDraft(Page $draft, array $input): Page
     {
-        $this->updateTemplateStatusAndContentFromInput($draft, $input);
-        $this->baseRepo->update($draft, $input);
-
         $draft->draft = false;
         $draft->revision_count = 1;
-        $draft->priority = $draft->priority ?: $this->getNewPriority($draft);
-        $draft->save();
+        $draft->priority = $this->getNewPriority($draft);
+        $this->updateTemplateStatusAndContentFromInput($draft, $input);
+        $this->baseRepo->update($draft, $input);
 
         $this->revisionRepo->storeNewForPage($draft, trans('entities.pages_initial_revision'));
         $this->referenceStore->updateForPage($draft);
index afd3c71f19577a01a5af1e0324e02dcf269d2d7e..a7a0e072c6c6db48a8727400399edd2907c37999 100644 (file)
@@ -2,10 +2,9 @@
   "book_id": 1,
   "name": "My fantastic new chapter",
   "description": "This is a great new chapter that I've created via the API",
+  "priority": 15,
   "tags": [
     {"name": "Category", "value": "Top Content"},
     {"name": "Rating", "value": "Highest"}
-  ],
-  "priority": 15
-}
+  ]
 }
index f62d63d1e9cd35ef36966efea27f8deb58ed6e48..18c40301b6d7a6784b4ee3c88ddcf1b1967d3b1d 100644 (file)
@@ -2,9 +2,9 @@
   "book_id": 1,
   "name": "My fantastic updated chapter",
   "description": "This is an updated chapter that I've altered via the API",
+  "priority": 16,
   "tags": [
     {"name": "Category", "value": "Kinda Good Content"},
     {"name": "Rating", "value": "Medium"}
-  ],
-  "priority": 15
+  ]
 }
index 5a21a80c75363696c9d14e7440d5088f624d6941..bb32943a2355544b7933247ba11e7d0b52aa2f5a 100644 (file)
@@ -2,9 +2,9 @@
        "book_id": 1,
        "name": "My API Page",
        "html": "<p>my new API page</p>",
+       "priority": 15,
        "tags": [
                {"name": "Category", "value": "Not Bad Content"},
                {"name": "Rating", "value": "Average"}
-       ],
-       "priority": 15
+       ]
 }
index fc8c73c0c395c750e4ab444afd7841c93c737fd2..e3ca9004e5e4c3599ab1c9c0582bc7b897b41ed2 100644 (file)
@@ -2,9 +2,9 @@
        "chapter_id": 1,
        "name": "My updated API Page",
        "html": "<p>my new API page - Updated</p>",
+       "priority": 16,
        "tags": [
                {"name": "Category", "value": "API Examples"},
                {"name": "Rating", "value": "Alright"}
-       ],
-       "priority": 15
+       ]
 }
index 4dbc764b157d29b035edf6407a2dc2dacd3b4cef..cf47b123df7bb1027a2a5a5fe96bb61afd9d667a 100644 (file)
@@ -4,7 +4,7 @@
   "slug": "my-fantastic-new-chapter",
   "name": "My fantastic new chapter",
   "description": "This is a great new chapter that I've created via the API",
-  "priority": 6,
+  "priority": 15,
   "created_by": 1,
   "updated_by": 1,
   "owned_by": 1,
index cc454d74086bad6705bda16dd2021226440192f5..a4940af2df535d35e5cb65682984cdb821a76449 100644 (file)
@@ -4,7 +4,7 @@
   "slug": "my-fantastic-updated-chapter",
   "name": "My fantastic updated chapter",
   "description": "This is an updated chapter that I've altered via the API",
-  "priority": 7,
+  "priority": 16,
   "created_at": "2020-05-22T23:03:35.000000Z",
   "updated_at": "2020-05-22T23:07:20.000000Z",
   "created_by": 1,
index 385d5384e72cb014ad7afb6c9c79013138c1afb4..11f5ab8c8a5e3bec5459a697fbf5d0941ef6e202 100644 (file)
@@ -6,7 +6,7 @@
        "slug": "my-api-page",
        "html": "<p id=\"bkmrk-my-new-api-page\">my new API page</p>",
        "raw_html": "<p id=\"bkmrk-my-new-api-page\">my new API page</p>",
-       "priority": 14,
+       "priority": 15,
        "created_at": "2020-11-28T15:01:39.000000Z",
        "updated_at": "2020-11-28T15:01:39.000000Z",
        "created_by": {
index a99a85af8167b9009e01718ea086b5b92408102d..0629f3aedae61fadd338fcc9dc20cfefc959da2d 100644 (file)
@@ -45,37 +45,7 @@ class ChaptersApiTest extends TestCase
                     'value' => 'tagvalue',
                 ],
             ],
-        ];
-
-        $resp = $this->postJson($this->baseEndpoint, $details);
-        $resp->assertStatus(200);
-        $newItem = Chapter::query()->orderByDesc('id')->where('name', '=', $details['name'])->first();
-        $resp->assertJson(array_merge($details, ['id' => $newItem->id, 'slug' => $newItem->slug]));
-        $this->assertDatabaseHas('tags', [
-            'entity_id'   => $newItem->id,
-            'entity_type' => $newItem->getMorphClass(),
-            'name'        => 'tagname',
-            'value'       => 'tagvalue',
-        ]);
-        $resp->assertJsonMissing(['pages' => []]);
-        $this->assertActivityExists('chapter_create', $newItem);
-    }
-
-    public function test_create_applies_correct_priority()
-    {
-        $this->actingAsApiEditor();
-        $book = $this->entities->book();
-        $details = [
-            'name'        => 'My API chapter',
-            'description' => 'A chapter created via the API',
-            'book_id'     => $book->id,
-            'tags'        => [
-                [
-                    'name'  => 'tagname',
-                    'value' => 'tagvalue',
-                ],
-            ],
-            'priority'     => 15,
+            'priority' => 15,
         ];
 
         $resp = $this->postJson($this->baseEndpoint, $details);
index a1f65692f05822482047af88878c9d139746f0af..0d084472d1a43e0caf78136a78b07801b8c816ed 100644 (file)
@@ -32,38 +32,6 @@ class PagesApiTest extends TestCase
     }
 
     public function test_create_endpoint()
-    {
-        $this->actingAsApiEditor();
-        $book = $this->entities->book();
-        $details = [
-            'name'    => 'My API page',
-            'book_id' => $book->id,
-            'html'    => '<p>My new page content</p>',
-            'tags'    => [
-                [
-                    'name'  => 'tagname',
-                    'value' => 'tagvalue',
-                ],
-            ],
-        ];
-
-        $resp = $this->postJson($this->baseEndpoint, $details);
-        unset($details['html']);
-        $resp->assertStatus(200);
-        $newItem = Page::query()->orderByDesc('id')->where('name', '=', $details['name'])->first();
-        $resp->assertJson(array_merge($details, ['id' => $newItem->id, 'slug' => $newItem->slug]));
-        $this->assertDatabaseHas('tags', [
-            'entity_id'   => $newItem->id,
-            'entity_type' => $newItem->getMorphClass(),
-            'name'        => 'tagname',
-            'value'       => 'tagvalue',
-        ]);
-        $resp->assertSeeText('My new page content');
-        $resp->assertJsonMissing(['book' => []]);
-        $this->assertActivityExists('page_create', $newItem);
-    }
-
-    public function test_create_applies_correct_priority()
     {
         $this->actingAsApiEditor();
         $book = $this->entities->book();