diff --git a/extensions/lock/extend.php b/extensions/lock/extend.php index 26000af97..dcb40b573 100644 --- a/extensions/lock/extend.php +++ b/extensions/lock/extend.php @@ -7,8 +7,9 @@ * LICENSE file that was distributed with this source code. */ -use Flarum\Api\Serializer\BasicDiscussionSerializer; -use Flarum\Api\Serializer\DiscussionSerializer; +use Flarum\Api\Context; +use Flarum\Api\Resource; +use Flarum\Api\Schema; use Flarum\Discussion\Discussion; use Flarum\Discussion\Event\Saving; use Flarum\Discussion\Search\DiscussionSearcher; @@ -33,24 +34,38 @@ return [ new Extend\Locales(__DIR__.'/locale'), (new Extend\Notification()) - ->type(DiscussionLockedBlueprint::class, BasicDiscussionSerializer::class, ['alert']), + ->type(DiscussionLockedBlueprint::class, ['alert']), (new Extend\Model(Discussion::class)) ->cast('is_locked', 'bool'), - (new Extend\ApiSerializer(DiscussionSerializer::class)) - ->attribute('isLocked', function (DiscussionSerializer $serializer, Discussion $discussion) { - return $discussion->is_locked; - }) - ->attribute('canLock', function (DiscussionSerializer $serializer, Discussion $discussion) { - return $serializer->getActor()->can('lock', $discussion); - }), + (new Extend\ApiResource(Resource\DiscussionResource::class)) + ->fields(fn () => [ + Schema\Boolean::make('isLocked') + ->writable(fn (Discussion $discussion, Context $context) => $context->getActor()->can('lock', $discussion)) + ->set(function (Discussion $discussion, bool $isLocked, Context $context) { + $actor = $context->getActor(); + + if ($discussion->is_locked === $isLocked) { + return; + } + + $discussion->is_locked = $isLocked; + + $discussion->raise( + $discussion->is_locked + ? new DiscussionWasLocked($discussion, $actor) + : new DiscussionWasUnlocked($discussion, $actor) + ); + }), + Schema\Boolean::make('canLock') + ->get(fn (Discussion $discussion, Context $context) => $context->getActor()->can('lock', $discussion)), + ]), (new Extend\Post()) ->type(DiscussionLockedPost::class), (new Extend\Event()) - ->listen(Saving::class, Listener\SaveLockedToDatabase::class) ->listen(DiscussionWasLocked::class, Listener\CreatePostWhenDiscussionIsLocked::class) ->listen(DiscussionWasUnlocked::class, Listener\CreatePostWhenDiscussionIsUnlocked::class), diff --git a/extensions/lock/src/Listener/SaveLockedToDatabase.php b/extensions/lock/src/Listener/SaveLockedToDatabase.php deleted file mode 100755 index e3c107a4f..000000000 --- a/extensions/lock/src/Listener/SaveLockedToDatabase.php +++ /dev/null @@ -1,40 +0,0 @@ -data['attributes']['isLocked'])) { - $isLocked = (bool) $event->data['attributes']['isLocked']; - $discussion = $event->discussion; - $actor = $event->actor; - - $actor->assertCan('lock', $discussion); - - if ((bool) $discussion->is_locked === $isLocked) { - return; - } - - $discussion->is_locked = $isLocked; - - $discussion->raise( - $discussion->is_locked - ? new DiscussionWasLocked($discussion, $actor) - : new DiscussionWasUnlocked($discussion, $actor) - ); - } - } -}