From b985aa86316bc417ae07c9428386b775d70e38f5 Mon Sep 17 00:00:00 2001 From: Sami Mazouz Date: Tue, 26 Jan 2021 23:08:47 +0100 Subject: [PATCH] Add permission to bypass tag count requirements (#111) --- extensions/tags/extend.php | 5 ++++- extensions/tags/js/src/admin/addTagPermission.js | 7 ++++++- .../tags/js/src/forum/components/TagDiscussionModal.js | 10 +++++++++- extensions/tags/src/Access/GlobalPolicy.php | 4 ++++ extensions/tags/src/Listener/SaveTagsToDatabase.php | 6 ++++-- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/extensions/tags/extend.php b/extensions/tags/extend.php index c547a578a..db1092a27 100644 --- a/extensions/tags/extend.php +++ b/extensions/tags/extend.php @@ -47,7 +47,10 @@ return [ ->belongsToMany('tags', Tag::class, 'discussion_tag'), (new Extend\ApiSerializer(ForumSerializer::class)) - ->hasMany('tags', TagSerializer::class), + ->hasMany('tags', TagSerializer::class) + ->attribute('canBypassTagCounts', function (ForumSerializer $serializer) { + return $serializer->getActor()->can('bypassTagCounts'); + }), (new Extend\ApiSerializer(DiscussionSerializer::class)) ->hasMany('tags', TagSerializer::class) diff --git a/extensions/tags/js/src/admin/addTagPermission.js b/extensions/tags/js/src/admin/addTagPermission.js index 6188830d6..340df1d76 100644 --- a/extensions/tags/js/src/admin/addTagPermission.js +++ b/extensions/tags/js/src/admin/addTagPermission.js @@ -5,5 +5,10 @@ export default function () { icon: 'fas fa-tag', label: app.translator.trans('flarum-tags.admin.permissions.tag_discussions_label'), permission: 'discussion.tag', - }, 'moderate', 95); + }, 'moderate', 95) + .registerPermission({ + icon: 'fas fa-tags', + label: app.translator.trans('flarum-tags.admin.permissions.bypass_tag_counts_label'), + permission: 'bypassTagCounts', + }, 'start', 89); } diff --git a/extensions/tags/js/src/forum/components/TagDiscussionModal.js b/extensions/tags/js/src/forum/components/TagDiscussionModal.js index 069960d73..79aed699e 100644 --- a/extensions/tags/js/src/forum/components/TagDiscussionModal.js +++ b/extensions/tags/js/src/forum/components/TagDiscussionModal.js @@ -177,7 +177,7 @@ export default class TagDiscussionModal extends Modal {
-
@@ -218,6 +218,14 @@ export default class TagDiscussionModal extends Modal { ]; } + meetsRequirements(primaryCount, secondaryCount) { + if (app.forum.attribute('canBypassTagCounts')) { + return true; + } + + return primaryCount >= this.minPrimary && secondaryCount >= this.minSecondary; + } + toggleTag(tag) { const index = this.selected.indexOf(tag); diff --git a/extensions/tags/src/Access/GlobalPolicy.php b/extensions/tags/src/Access/GlobalPolicy.php index dd7636266..1ce1a738c 100644 --- a/extensions/tags/src/Access/GlobalPolicy.php +++ b/extensions/tags/src/Access/GlobalPolicy.php @@ -34,6 +34,10 @@ class GlobalPolicy extends AbstractPolicy public function can(User $actor, string $ability) { if (in_array($ability, ['viewDiscussions', 'startDiscussion'])) { + if ($actor->hasPermission($ability) && $actor->hasPermission('bypassTagCounts')) { + return $this->allow(); + } + $enoughPrimary = count(Tag::getIdsWhereCan($actor, $ability, true, false)) >= $this->settings->get('flarum-tags.min_primary_tags'); $enoughSecondary = count(Tag::getIdsWhereCan($actor, $ability, false, true)) >= $this->settings->get('flarum-tags.min_secondary_tags'); diff --git a/extensions/tags/src/Listener/SaveTagsToDatabase.php b/extensions/tags/src/Listener/SaveTagsToDatabase.php index 1359d340e..8996abd50 100755 --- a/extensions/tags/src/Listener/SaveTagsToDatabase.php +++ b/extensions/tags/src/Listener/SaveTagsToDatabase.php @@ -111,8 +111,10 @@ class SaveTagsToDatabase throw new PermissionDeniedException; } - $this->validateTagCount('primary', $primaryCount); - $this->validateTagCount('secondary', $secondaryCount); + if (! $actor->can('bypassTagCounts', $discussion)) { + $this->validateTagCount('primary', $primaryCount); + $this->validateTagCount('secondary', $secondaryCount); + } $discussion->afterSave(function ($discussion) use ($newTagIds) { $discussion->tags()->sync($newTagIds);