API: Reviewed changes for API priority control

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.
This commit is contained in:
Dan Brown 2023-08-21 15:40:53 +01:00
parent 3a36d3c847
commit 9ca1139ab0
No known key found for this signature in database
GPG Key ID: 46D9F943C24A2EF9
12 changed files with 27 additions and 110 deletions

View File

@ -10,7 +10,7 @@ class ApiEntityListFormatter
* The list to be formatted. * The list to be formatted.
* @var Entity[] * @var Entity[]
*/ */
protected $list = []; protected array $list = [];
/** /**
* The fields to show in the formatted data. * 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. * will be used for the resultant value. A null return value will omit the property.
* @var array<string|int, string|callable> * @var array<string|int, string|callable>
*/ */
protected $fields = [ protected array $fields = [
'id', 'name', 'slug', 'book_id', 'chapter_id', 'id', 'name', 'slug', 'book_id', 'chapter_id', 'draft',
'draft', 'template', 'created_at', 'updated_at', 'template', 'priority', 'created_at', 'updated_at',
'priority'
]; ];
public function __construct(array $list) public function __construct(array $list)

View File

@ -16,14 +16,9 @@ use Exception;
class ChapterRepo class ChapterRepo
{ {
protected $baseRepo; public function __construct(
protected BaseRepo $baseRepo
/** ) {
* ChapterRepo constructor.
*/
public function __construct(BaseRepo $baseRepo)
{
$this->baseRepo = $baseRepo;
} }
/** /**
@ -49,7 +44,7 @@ class ChapterRepo
{ {
$chapter = new Chapter(); $chapter = new Chapter();
$chapter->book_id = $parentBook->id; $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); $this->baseRepo->create($chapter, $input);
Activity::add(ActivityType::CHAPTER_CREATE, $chapter); Activity::add(ActivityType::CHAPTER_CREATE, $chapter);

View File

@ -23,24 +23,12 @@ use Illuminate\Pagination\LengthAwarePaginator;
class PageRepo class PageRepo
{ {
protected BaseRepo $baseRepo;
protected RevisionRepo $revisionRepo;
protected ReferenceStore $referenceStore;
protected ReferenceUpdater $referenceUpdater;
/**
* PageRepo constructor.
*/
public function __construct( public function __construct(
BaseRepo $baseRepo, protected BaseRepo $baseRepo,
RevisionRepo $revisionRepo, protected RevisionRepo $revisionRepo,
ReferenceStore $referenceStore, protected ReferenceStore $referenceStore,
ReferenceUpdater $referenceUpdater 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 public function publishDraft(Page $draft, array $input): Page
{ {
$this->updateTemplateStatusAndContentFromInput($draft, $input);
$this->baseRepo->update($draft, $input);
$draft->draft = false; $draft->draft = false;
$draft->revision_count = 1; $draft->revision_count = 1;
$draft->priority = $draft->priority ?: $this->getNewPriority($draft); $draft->priority = $this->getNewPriority($draft);
$draft->save(); $this->updateTemplateStatusAndContentFromInput($draft, $input);
$this->baseRepo->update($draft, $input);
$this->revisionRepo->storeNewForPage($draft, trans('entities.pages_initial_revision')); $this->revisionRepo->storeNewForPage($draft, trans('entities.pages_initial_revision'));
$this->referenceStore->updateForPage($draft); $this->referenceStore->updateForPage($draft);

View File

@ -2,10 +2,9 @@
"book_id": 1, "book_id": 1,
"name": "My fantastic new chapter", "name": "My fantastic new chapter",
"description": "This is a great new chapter that I've created via the API", "description": "This is a great new chapter that I've created via the API",
"priority": 15,
"tags": [ "tags": [
{"name": "Category", "value": "Top Content"}, {"name": "Category", "value": "Top Content"},
{"name": "Rating", "value": "Highest"} {"name": "Rating", "value": "Highest"}
], ]
"priority": 15
}
} }

View File

@ -2,9 +2,9 @@
"book_id": 1, "book_id": 1,
"name": "My fantastic updated chapter", "name": "My fantastic updated chapter",
"description": "This is an updated chapter that I've altered via the API", "description": "This is an updated chapter that I've altered via the API",
"priority": 16,
"tags": [ "tags": [
{"name": "Category", "value": "Kinda Good Content"}, {"name": "Category", "value": "Kinda Good Content"},
{"name": "Rating", "value": "Medium"} {"name": "Rating", "value": "Medium"}
], ]
"priority": 15
} }

View File

@ -2,9 +2,9 @@
"book_id": 1, "book_id": 1,
"name": "My API Page", "name": "My API Page",
"html": "<p>my new API page</p>", "html": "<p>my new API page</p>",
"priority": 15,
"tags": [ "tags": [
{"name": "Category", "value": "Not Bad Content"}, {"name": "Category", "value": "Not Bad Content"},
{"name": "Rating", "value": "Average"} {"name": "Rating", "value": "Average"}
], ]
"priority": 15
} }

View File

@ -2,9 +2,9 @@
"chapter_id": 1, "chapter_id": 1,
"name": "My updated API Page", "name": "My updated API Page",
"html": "<p>my new API page - Updated</p>", "html": "<p>my new API page - Updated</p>",
"priority": 16,
"tags": [ "tags": [
{"name": "Category", "value": "API Examples"}, {"name": "Category", "value": "API Examples"},
{"name": "Rating", "value": "Alright"} {"name": "Rating", "value": "Alright"}
], ]
"priority": 15
} }

View File

@ -4,7 +4,7 @@
"slug": "my-fantastic-new-chapter", "slug": "my-fantastic-new-chapter",
"name": "My fantastic new chapter", "name": "My fantastic new chapter",
"description": "This is a great new chapter that I've created via the API", "description": "This is a great new chapter that I've created via the API",
"priority": 6, "priority": 15,
"created_by": 1, "created_by": 1,
"updated_by": 1, "updated_by": 1,
"owned_by": 1, "owned_by": 1,

View File

@ -4,7 +4,7 @@
"slug": "my-fantastic-updated-chapter", "slug": "my-fantastic-updated-chapter",
"name": "My fantastic updated chapter", "name": "My fantastic updated chapter",
"description": "This is an updated chapter that I've altered via the API", "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", "created_at": "2020-05-22T23:03:35.000000Z",
"updated_at": "2020-05-22T23:07:20.000000Z", "updated_at": "2020-05-22T23:07:20.000000Z",
"created_by": 1, "created_by": 1,

View File

@ -6,7 +6,7 @@
"slug": "my-api-page", "slug": "my-api-page",
"html": "<p id=\"bkmrk-my-new-api-page\">my new API page</p>", "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>", "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", "created_at": "2020-11-28T15:01:39.000000Z",
"updated_at": "2020-11-28T15:01:39.000000Z", "updated_at": "2020-11-28T15:01:39.000000Z",
"created_by": { "created_by": {

View File

@ -32,36 +32,6 @@ class ChaptersApiTest extends TestCase
} }
public function test_create_endpoint() public function test_create_endpoint()
{
$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',
],
],
];
$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(); $this->actingAsApiEditor();
$book = $this->entities->book(); $book = $this->entities->book();

View File

@ -32,38 +32,6 @@ class PagesApiTest extends TestCase
} }
public function test_create_endpoint() 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(); $this->actingAsApiEditor();
$book = $this->entities->book(); $book = $this->entities->book();