diff --git a/extensions/suspend/extend.php b/extensions/suspend/extend.php index 57670b38b..f0a4d506e 100644 --- a/extensions/suspend/extend.php +++ b/extensions/suspend/extend.php @@ -7,13 +7,13 @@ * LICENSE file that was distributed with this source code. */ -use Flarum\Api\Serializer\BasicUserSerializer; -use Flarum\Api\Serializer\ForumSerializer; -use Flarum\Api\Serializer\UserSerializer; +use Flarum\Api\Context; +use Flarum\Api\Schema; +use Flarum\Api\Resource; use Flarum\Extend; use Flarum\Search\Database\DatabaseSearchDriver; use Flarum\Suspend\Access\UserPolicy; -use Flarum\Suspend\AddUserSuspendAttributes; +use Flarum\Suspend\Api\UserResourceFields; use Flarum\Suspend\Event\Suspended; use Flarum\Suspend\Event\Unsuspended; use Flarum\Suspend\Listener; @@ -39,22 +39,23 @@ return [ ->cast('suspend_reason', 'string') ->cast('suspend_message', 'string'), - (new Extend\ApiSerializer(UserSerializer::class)) - ->attributes(AddUserSuspendAttributes::class), + (new Extend\ApiResource(Resource\UserResource::class)) + ->fields(UserResourceFields::class), - (new Extend\ApiSerializer(ForumSerializer::class)) - ->attribute('canSuspendUsers', function (ForumSerializer $serializer) { - return $serializer->getActor()->hasPermission('user.suspend'); - }), + (new Extend\ApiResource(Resource\ForumResource::class)) + ->fields(fn () => [ + Schema\Boolean::make('canSuspendUsers') + ->get(fn (object $model, Context $context) => $context->getActor()->hasPermission('user.suspend')), + ]), new Extend\Locales(__DIR__.'/locale'), (new Extend\Notification()) - ->type(UserSuspendedBlueprint::class, BasicUserSerializer::class, ['alert', 'email']) - ->type(UserUnsuspendedBlueprint::class, BasicUserSerializer::class, ['alert', 'email']), + ->type(UserSuspendedBlueprint::class, ['alert', 'email']) + ->type(UserUnsuspendedBlueprint::class, ['alert', 'email']), (new Extend\Event()) - ->listen(Saving::class, Listener\SaveSuspensionToDatabase::class) + ->listen(Saving::class, Listener\SavingUser::class) ->listen(Suspended::class, Listener\SendNotificationWhenUserIsSuspended::class) ->listen(Unsuspended::class, Listener\SendNotificationWhenUserIsUnsuspended::class), diff --git a/extensions/suspend/src/AddUserSuspendAttributes.php b/extensions/suspend/src/AddUserSuspendAttributes.php deleted file mode 100755 index 44d63a5cb..000000000 --- a/extensions/suspend/src/AddUserSuspendAttributes.php +++ /dev/null @@ -1,35 +0,0 @@ -getActor()->can('suspend', $user); - - if ($canSuspend) { - $attributes['suspendReason'] = $user->suspend_reason; - } - - if ($serializer->getActor()->id === $user->id || $canSuspend) { - $attributes['suspendMessage'] = $user->suspend_message; - $attributes['suspendedUntil'] = $serializer->formatDate($user->suspended_until); - } - - $attributes['canSuspend'] = $canSuspend; - - return $attributes; - } -} diff --git a/extensions/suspend/src/Api/UserResourceFields.php b/extensions/suspend/src/Api/UserResourceFields.php new file mode 100644 index 000000000..53e190011 --- /dev/null +++ b/extensions/suspend/src/Api/UserResourceFields.php @@ -0,0 +1,28 @@ +get($canSuspend = fn (User $user, Context $context) => $context->getActor()->can('suspend', $user)), + Schema\Str::make('suspendReason') + ->writable($canSuspend) + ->visible($canSuspend), + Schema\Str::make('suspendMessage') + ->writable($canSuspend) + ->visible(fn (User $user, Context $context) => $context->getActor()->id === $user->id || $canSuspend($user, $context)), + Schema\Date::make('suspendedUntil') + ->writable($canSuspend) + ->visible(fn (User $user, Context $context) => $context->getActor()->id === $user->id || $canSuspend($user, $context)) + ->nullable(), + ]; + } +} diff --git a/extensions/suspend/src/Listener/SaveSuspensionToDatabase.php b/extensions/suspend/src/Listener/SaveSuspensionToDatabase.php deleted file mode 100755 index 34e40e7ac..000000000 --- a/extensions/suspend/src/Listener/SaveSuspensionToDatabase.php +++ /dev/null @@ -1,60 +0,0 @@ -data, 'attributes', []); - - if (array_key_exists('suspendedUntil', $attributes)) { - $this->validator->assertValid($attributes); - - $user = $event->user; - $actor = $event->actor; - - $actor->assertCan('suspend', $user); - - if ($attributes['suspendedUntil']) { - $user->suspended_until = Carbon::createFromTimestamp((new DateTime($attributes['suspendedUntil']))->getTimestamp()); - $user->suspend_reason = empty($attributes['suspendReason']) ? null : $attributes['suspendReason']; - $user->suspend_message = empty($attributes['suspendMessage']) ? null : $attributes['suspendMessage']; - } else { - $user->suspended_until = null; - $user->suspend_reason = null; - $user->suspend_message = null; - } - - if ($user->isDirty(['suspended_until', 'suspend_reason', 'suspend_message'])) { - $this->events->dispatch( - $user->suspended_until === null ? - new Unsuspended($user, $actor) : - new Suspended($user, $actor) - ); - } - } - } -} diff --git a/extensions/suspend/src/Listener/SavingUser.php b/extensions/suspend/src/Listener/SavingUser.php new file mode 100755 index 000000000..87ea07ad7 --- /dev/null +++ b/extensions/suspend/src/Listener/SavingUser.php @@ -0,0 +1,37 @@ +user; + $actor = $event->actor; + + if ($user->isDirty(['suspended_until', 'suspend_reason', 'suspend_message'])) { + $this->events->dispatch( + $user->suspended_until === null ? + new Unsuspended($user, $actor) : + new Suspended($user, $actor) + ); + } + } +} diff --git a/extensions/suspend/src/SuspendValidator.php b/extensions/suspend/src/SuspendValidator.php deleted file mode 100644 index db91666ea..000000000 --- a/extensions/suspend/src/SuspendValidator.php +++ /dev/null @@ -1,19 +0,0 @@ - ['nullable', 'date'], - ]; -}