From 384f17ea943116e9a66d880132b361f04cfc78ba Mon Sep 17 00:00:00 2001 From: Sami Mazouz Date: Tue, 8 Dec 2020 20:20:50 +0100 Subject: [PATCH] Use new extenders (#102) --- extensions/tags/extend.php | 39 +++++++++-- .../AddDiscussionTagsRelationship.php | 63 ----------------- .../src/Listener/AddForumTagsRelationship.php | 69 ------------------- .../PrepareForumTagsApiAttributes.php | 40 ----------- .../tags/src/LoadForumTagsRelationship.php | 35 ++++++++++ 5 files changed, 68 insertions(+), 178 deletions(-) delete mode 100755 extensions/tags/src/Listener/AddDiscussionTagsRelationship.php delete mode 100755 extensions/tags/src/Listener/AddForumTagsRelationship.php delete mode 100755 extensions/tags/src/Listener/PrepareForumTagsApiAttributes.php create mode 100755 extensions/tags/src/LoadForumTagsRelationship.php diff --git a/extensions/tags/extend.php b/extensions/tags/extend.php index 1b64d4409..c0dd41862 100644 --- a/extensions/tags/extend.php +++ b/extensions/tags/extend.php @@ -7,14 +7,18 @@ * LICENSE file that was distributed with this source code. */ -use Flarum\Api\Event\Serializing; +use Flarum\Api\Controller as FlarumController; +use Flarum\Api\Serializer\DiscussionSerializer; +use Flarum\Api\Serializer\ForumSerializer; use Flarum\Discussion\Discussion; use Flarum\Discussion\Event\Saving; use Flarum\Extend; use Flarum\Tags\Access; use Flarum\Tags\Api\Controller; +use Flarum\Tags\Api\Serializer\TagSerializer; use Flarum\Tags\Content; use Flarum\Tags\Listener; +use Flarum\Tags\LoadForumTagsRelationship; use Flarum\Tags\Tag; use Illuminate\Contracts\Events\Dispatcher; @@ -39,17 +43,40 @@ return [ (new Extend\Model(Discussion::class)) ->belongsToMany('tags', Tag::class, 'discussion_tag'), + (new Extend\ApiSerializer(ForumSerializer::class)) + ->hasMany('tags', TagSerializer::class), + + (new Extend\ApiSerializer(DiscussionSerializer::class)) + ->hasMany('tags', TagSerializer::class) + ->attribute('canTag', function (DiscussionSerializer $serializer, $model) { + return $serializer->getActor()->can('tag', $model); + }), + + (new Extend\ApiController(FlarumController\ListDiscussionsController::class)) + ->addInclude(['tags', 'tags.state']), + + (new Extend\ApiController(FlarumController\ShowDiscussionController::class)) + ->addInclude(['tags', 'tags.state']), + + (new Extend\ApiController(FlarumController\CreateDiscussionController::class)) + ->addInclude(['tags', 'tags.state']), + + (new Extend\ApiController(FlarumController\ShowForumController::class)) + ->addInclude(['tags', 'tags.lastPostedDiscussion', 'tags.parent']) + ->prepareDataForSerialization(LoadForumTagsRelationship::class), + + (new Extend\Settings()) + ->serializeToForum('minPrimaryTags', 'flarum-tags.min_primary_tags') + ->serializeToForum('maxPrimaryTags', 'flarum-tags.max_primary_tags') + ->serializeToForum('minSecondaryTags', 'flarum-tags.min_secondary_tags') + ->serializeToForum('maxSecondaryTags', 'flarum-tags.max_secondary_tags'), + new Extend\Locales(__DIR__.'/locale'), (new Extend\View) ->namespace('tags', __DIR__.'/views'), function (Dispatcher $events) { - $events->subscribe(Listener\AddDiscussionTagsRelationship::class); - - $events->subscribe(Listener\AddForumTagsRelationship::class); - $events->listen(Serializing::class, Listener\PrepareForumTagsApiAttributes::class); - $events->subscribe(Listener\CreatePostWhenTagsAreChanged::class); $events->subscribe(Listener\FilterDiscussionListByTags::class); $events->subscribe(Listener\FilterPostsQueryByTag::class); diff --git a/extensions/tags/src/Listener/AddDiscussionTagsRelationship.php b/extensions/tags/src/Listener/AddDiscussionTagsRelationship.php deleted file mode 100755 index 4500fc9e0..000000000 --- a/extensions/tags/src/Listener/AddDiscussionTagsRelationship.php +++ /dev/null @@ -1,63 +0,0 @@ -listen(GetApiRelationship::class, [$this, 'getApiRelationship']); - $events->listen(WillGetData::class, [$this, 'includeTagsRelationship']); - $events->listen(Serializing::class, [$this, 'prepareApiAttributes']); - } - - /** - * @param GetApiRelationship $event - * @return \Tobscure\JsonApi\Relationship|null - */ - public function getApiRelationship(GetApiRelationship $event) - { - if ($event->isRelationship(DiscussionSerializer::class, 'tags')) { - return $event->serializer->hasMany($event->model, 'Flarum\Tags\Api\Serializer\TagSerializer', 'tags'); - } - } - - /** - * @param WillGetData $event - */ - public function includeTagsRelationship(WillGetData $event) - { - if ($event->isController(Controller\ListDiscussionsController::class) - || $event->isController(Controller\ShowDiscussionController::class) - || $event->isController(Controller\CreateDiscussionController::class)) { - $event->addInclude(['tags', 'tags.state']); - } - } - - /** - * @param Serializing $event - */ - public function prepareApiAttributes(Serializing $event) - { - if ($event->isSerializer(DiscussionSerializer::class)) { - $event->attributes['canTag'] = $event->actor->can('tag', $event->model); - } - } -} diff --git a/extensions/tags/src/Listener/AddForumTagsRelationship.php b/extensions/tags/src/Listener/AddForumTagsRelationship.php deleted file mode 100755 index 9baa89d47..000000000 --- a/extensions/tags/src/Listener/AddForumTagsRelationship.php +++ /dev/null @@ -1,69 +0,0 @@ -listen(GetApiRelationship::class, [$this, 'getApiRelationship']); - $events->listen(WillSerializeData::class, [$this, 'loadTagsRelationship']); - $events->listen(WillGetData::class, [$this, 'includeTagsRelationship']); - } - - /** - * @param GetApiRelationship $event - * @return \Tobscure\JsonApi\Relationship|null - */ - public function getApiRelationship(GetApiRelationship $event) - { - if ($event->isRelationship(ForumSerializer::class, 'tags')) { - return $event->serializer->hasMany($event->model, 'Flarum\Tags\Api\Serializer\TagSerializer', 'tags'); - } - } - - /** - * @param WillSerializeData $event - */ - public function loadTagsRelationship(WillSerializeData $event) - { - // Expose the complete tag list to clients by adding it as a - // relationship to the /api endpoint. Since the Forum model - // doesn't actually have a tags relationship, we will manually load and - // assign the tags data to it using an event listener. - if ($event->isController(ShowForumController::class)) { - $event->data['tags'] = Tag::whereVisibleTo($event->actor) - ->withStateFor($event->actor) - ->with(['parent', 'lastPostedDiscussion']) - ->get(); - } - } - - /** - * @param WillGetData $event - */ - public function includeTagsRelationship(WillGetData $event) - { - if ($event->isController(ShowForumController::class)) { - $event->addInclude(['tags', 'tags.lastPostedDiscussion', 'tags.parent']); - } - } -} diff --git a/extensions/tags/src/Listener/PrepareForumTagsApiAttributes.php b/extensions/tags/src/Listener/PrepareForumTagsApiAttributes.php deleted file mode 100755 index 06eec435d..000000000 --- a/extensions/tags/src/Listener/PrepareForumTagsApiAttributes.php +++ /dev/null @@ -1,40 +0,0 @@ -settings = $settings; - } - - public function handle(Serializing $event) - { - if ($event->isSerializer(ForumSerializer::class)) { - $event->attributes['minPrimaryTags'] = $this->settings->get('flarum-tags.min_primary_tags'); - $event->attributes['maxPrimaryTags'] = $this->settings->get('flarum-tags.max_primary_tags'); - $event->attributes['minSecondaryTags'] = $this->settings->get('flarum-tags.min_secondary_tags'); - $event->attributes['maxSecondaryTags'] = $this->settings->get('flarum-tags.max_secondary_tags'); - } - } -} diff --git a/extensions/tags/src/LoadForumTagsRelationship.php b/extensions/tags/src/LoadForumTagsRelationship.php new file mode 100755 index 000000000..9b51fe196 --- /dev/null +++ b/extensions/tags/src/LoadForumTagsRelationship.php @@ -0,0 +1,35 @@ +getAttribute('actor'); + + // Expose the complete tag list to clients by adding it as a + // relationship to the /api endpoint. Since the Forum model + // doesn't actually have a tags relationship, we will manually load and + // assign the tags data to it using an event listener. + $data['tags'] = Tag::whereVisibleTo($actor) + ->withStateFor($actor) + ->with(['parent', 'lastPostedDiscussion']) + ->get(); + } +}