From f61d834a7650cc3cd3f8f14d33dbc6e5ef9c9e6d Mon Sep 17 00:00:00 2001 From: Dave Shoreman Date: Tue, 11 Apr 2017 05:24:35 +0100 Subject: [PATCH] Enable parent to be set during creation via API (#39) * Enable parent to be set during creation via API Sets the parent ID as long as it exists and is a top-level primary tag. If it's not, it'll simply be ignored. Position is set automatically to be one higher than the current highest, or 0 if parent has no children. Example data (in addition to the usual attributes): ``` "relationships": { "parent": { "data": { "id": 1 } } } ``` * Add support for creating top-level tags To set a top-level primary tag, pass parent id of 0 For a secondary tag, pass null or remove it from the request To set as a child, pass the parent tag's id --- .../src/Api/Controller/CreateTagController.php | 5 +++++ extensions/tags/src/Command/CreateTagHandler.php | 15 +++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/extensions/tags/src/Api/Controller/CreateTagController.php b/extensions/tags/src/Api/Controller/CreateTagController.php index ec8ccc329..fb5d5574e 100644 --- a/extensions/tags/src/Api/Controller/CreateTagController.php +++ b/extensions/tags/src/Api/Controller/CreateTagController.php @@ -25,6 +25,11 @@ class CreateTagController extends AbstractCreateController */ public $serializer = TagSerializer::class; + /** + * {@inheritdoc} + */ + public $include = ['parent']; + /** * @var Dispatcher */ diff --git a/extensions/tags/src/Command/CreateTagHandler.php b/extensions/tags/src/Command/CreateTagHandler.php index d3f9a900e..35680566b 100644 --- a/extensions/tags/src/Command/CreateTagHandler.php +++ b/extensions/tags/src/Command/CreateTagHandler.php @@ -51,6 +51,21 @@ class CreateTagHandler array_get($data, 'attributes.isHidden') ); + $parentId = array_get($data, 'relationships.parent.data.id'); + + if ($parentId !== null) { + $rootTags = Tag::whereNull('parent_id')->whereNotNull('position'); + + if ($parentId === 0) { + $tag->position = $rootTags->max('position') + 1; + } elseif ($rootTags->find($parentId)) { + $position = Tag::where('parent_id', $parentId)->max('position'); + + $tag->parent()->associate($parentId); + $tag->position = $position === null ? 0 : $position + 1; + } + } + $this->validator->assertValid($tag->getAttributes()); $tag->save();