diff --git a/extensions/sticky/js/bootstrap.js b/extensions/sticky/js/bootstrap.js index d7ba8d882..c176c9436 100644 --- a/extensions/sticky/js/bootstrap.js +++ b/extensions/sticky/js/bootstrap.js @@ -19,6 +19,7 @@ app.initializers.add('sticky', function() { app.notificationComponentRegistry['discussionStickied'] = NotificationDiscussionStickied; Discussion.prototype.isSticky = Model.prop('isSticky'); + Discussion.prototype.canSticky = Model.prop('canSticky'); // Add a sticky badge to discussions. extend(Discussion.prototype, 'badges', function(badges) { @@ -42,7 +43,7 @@ app.initializers.add('sticky', function() { // Add a sticky control to discussions. extend(Discussion.prototype, 'controls', function(items) { - if (this.canEdit()) { + if (this.canSticky()) { items.add('sticky', ActionButton.component({ label: this.isSticky() ? 'Unsticky' : 'Sticky', icon: 'thumb-tack', diff --git a/extensions/sticky/src/Handlers/StickySaver.php b/extensions/sticky/src/Handlers/StickySaver.php index cffbb6208..d01da961c 100755 --- a/extensions/sticky/src/Handlers/StickySaver.php +++ b/extensions/sticky/src/Handlers/StickySaver.php @@ -18,6 +18,8 @@ class StickySaver $discussion = $event->discussion; $user = $event->command->user; + $discussion->assertCan($user, 'sticky'); + if ((bool) $discussion->is_sticky === $isSticky) { return; } diff --git a/extensions/sticky/src/StickyServiceProvider.php b/extensions/sticky/src/StickyServiceProvider.php index 2dd79f6e7..f5c1496a7 100644 --- a/extensions/sticky/src/StickyServiceProvider.php +++ b/extensions/sticky/src/StickyServiceProvider.php @@ -23,12 +23,15 @@ class StickyServiceProvider extends ServiceProvider $this->postType('Flarum\Sticky\DiscussionStickiedPost'); - $this->serializeAttributes('Flarum\Api\Serializers\DiscussionSerializer', function (&$attributes, $model) { + $this->serializeAttributes('Flarum\Api\Serializers\DiscussionSerializer', function (&$attributes, $model, $serializer) { $attributes['isSticky'] = (bool) $model->is_sticky; + $attributes['canSticky'] = (bool) $model->can($serializer->actor->getUser(), 'sticky'); }); $this->discussionGambit('Flarum\Sticky\StickyGambit'); $this->notificationType('Flarum\Sticky\DiscussionStickiedNotification', ['alert' => true]); + + $this->permission('discussion.sticky'); } }