mirror of
https://github.com/flarum/core.git
synced 2025-08-05 07:57:46 +02:00
feat: refactor suspend extension
This commit is contained in:
@@ -7,13 +7,13 @@
|
|||||||
* LICENSE file that was distributed with this source code.
|
* LICENSE file that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use Flarum\Api\Serializer\BasicUserSerializer;
|
use Flarum\Api\Context;
|
||||||
use Flarum\Api\Serializer\ForumSerializer;
|
use Flarum\Api\Schema;
|
||||||
use Flarum\Api\Serializer\UserSerializer;
|
use Flarum\Api\Resource;
|
||||||
use Flarum\Extend;
|
use Flarum\Extend;
|
||||||
use Flarum\Search\Database\DatabaseSearchDriver;
|
use Flarum\Search\Database\DatabaseSearchDriver;
|
||||||
use Flarum\Suspend\Access\UserPolicy;
|
use Flarum\Suspend\Access\UserPolicy;
|
||||||
use Flarum\Suspend\AddUserSuspendAttributes;
|
use Flarum\Suspend\Api\UserResourceFields;
|
||||||
use Flarum\Suspend\Event\Suspended;
|
use Flarum\Suspend\Event\Suspended;
|
||||||
use Flarum\Suspend\Event\Unsuspended;
|
use Flarum\Suspend\Event\Unsuspended;
|
||||||
use Flarum\Suspend\Listener;
|
use Flarum\Suspend\Listener;
|
||||||
@@ -39,22 +39,23 @@ return [
|
|||||||
->cast('suspend_reason', 'string')
|
->cast('suspend_reason', 'string')
|
||||||
->cast('suspend_message', 'string'),
|
->cast('suspend_message', 'string'),
|
||||||
|
|
||||||
(new Extend\ApiSerializer(UserSerializer::class))
|
(new Extend\ApiResource(Resource\UserResource::class))
|
||||||
->attributes(AddUserSuspendAttributes::class),
|
->fields(UserResourceFields::class),
|
||||||
|
|
||||||
(new Extend\ApiSerializer(ForumSerializer::class))
|
(new Extend\ApiResource(Resource\ForumResource::class))
|
||||||
->attribute('canSuspendUsers', function (ForumSerializer $serializer) {
|
->fields(fn () => [
|
||||||
return $serializer->getActor()->hasPermission('user.suspend');
|
Schema\Boolean::make('canSuspendUsers')
|
||||||
}),
|
->get(fn (object $model, Context $context) => $context->getActor()->hasPermission('user.suspend')),
|
||||||
|
]),
|
||||||
|
|
||||||
new Extend\Locales(__DIR__.'/locale'),
|
new Extend\Locales(__DIR__.'/locale'),
|
||||||
|
|
||||||
(new Extend\Notification())
|
(new Extend\Notification())
|
||||||
->type(UserSuspendedBlueprint::class, BasicUserSerializer::class, ['alert', 'email'])
|
->type(UserSuspendedBlueprint::class, ['alert', 'email'])
|
||||||
->type(UserUnsuspendedBlueprint::class, BasicUserSerializer::class, ['alert', 'email']),
|
->type(UserUnsuspendedBlueprint::class, ['alert', 'email']),
|
||||||
|
|
||||||
(new Extend\Event())
|
(new Extend\Event())
|
||||||
->listen(Saving::class, Listener\SaveSuspensionToDatabase::class)
|
->listen(Saving::class, Listener\SavingUser::class)
|
||||||
->listen(Suspended::class, Listener\SendNotificationWhenUserIsSuspended::class)
|
->listen(Suspended::class, Listener\SendNotificationWhenUserIsSuspended::class)
|
||||||
->listen(Unsuspended::class, Listener\SendNotificationWhenUserIsUnsuspended::class),
|
->listen(Unsuspended::class, Listener\SendNotificationWhenUserIsUnsuspended::class),
|
||||||
|
|
||||||
|
@@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Flarum.
|
|
||||||
*
|
|
||||||
* For detailed copyright and license information, please view the
|
|
||||||
* LICENSE file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Flarum\Suspend;
|
|
||||||
|
|
||||||
use Flarum\Api\Serializer\UserSerializer;
|
|
||||||
use Flarum\User\User;
|
|
||||||
|
|
||||||
class AddUserSuspendAttributes
|
|
||||||
{
|
|
||||||
public function __invoke(UserSerializer $serializer, User $user): array
|
|
||||||
{
|
|
||||||
$attributes = [];
|
|
||||||
$canSuspend = $serializer->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;
|
|
||||||
}
|
|
||||||
}
|
|
28
extensions/suspend/src/Api/UserResourceFields.php
Normal file
28
extensions/suspend/src/Api/UserResourceFields.php
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Flarum\Suspend\Api;
|
||||||
|
|
||||||
|
use Flarum\Api\Context;
|
||||||
|
use Flarum\Api\Schema;
|
||||||
|
use Flarum\User\User;
|
||||||
|
|
||||||
|
class UserResourceFields
|
||||||
|
{
|
||||||
|
public function __invoke(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
Schema\Boolean::make('canSuspend')
|
||||||
|
->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(),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@@ -1,60 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Flarum.
|
|
||||||
*
|
|
||||||
* For detailed copyright and license information, please view the
|
|
||||||
* LICENSE file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Flarum\Suspend\Listener;
|
|
||||||
|
|
||||||
use Carbon\Carbon;
|
|
||||||
use DateTime;
|
|
||||||
use Flarum\Suspend\Event\Suspended;
|
|
||||||
use Flarum\Suspend\Event\Unsuspended;
|
|
||||||
use Flarum\Suspend\SuspendValidator;
|
|
||||||
use Flarum\User\Event\Saving;
|
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
|
||||||
use Illuminate\Support\Arr;
|
|
||||||
|
|
||||||
class SaveSuspensionToDatabase
|
|
||||||
{
|
|
||||||
public function __construct(
|
|
||||||
protected SuspendValidator $validator,
|
|
||||||
protected Dispatcher $events
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public function handle(Saving $event): void
|
|
||||||
{
|
|
||||||
$attributes = Arr::get($event->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)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
37
extensions/suspend/src/Listener/SavingUser.php
Executable file
37
extensions/suspend/src/Listener/SavingUser.php
Executable file
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Flarum.
|
||||||
|
*
|
||||||
|
* For detailed copyright and license information, please view the
|
||||||
|
* LICENSE file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Flarum\Suspend\Listener;
|
||||||
|
|
||||||
|
use Flarum\Suspend\Event\Suspended;
|
||||||
|
use Flarum\Suspend\Event\Unsuspended;
|
||||||
|
use Flarum\User\Event\Saving;
|
||||||
|
use Illuminate\Contracts\Events\Dispatcher;
|
||||||
|
|
||||||
|
class SavingUser
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
protected Dispatcher $events
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handle(Saving $event): void
|
||||||
|
{
|
||||||
|
$user = $event->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)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -1,19 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Flarum.
|
|
||||||
*
|
|
||||||
* For detailed copyright and license information, please view the
|
|
||||||
* LICENSE file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Flarum\Suspend;
|
|
||||||
|
|
||||||
use Flarum\Foundation\AbstractValidator;
|
|
||||||
|
|
||||||
class SuspendValidator extends AbstractValidator
|
|
||||||
{
|
|
||||||
protected array $rules = [
|
|
||||||
'suspendedUntil' => ['nullable', 'date'],
|
|
||||||
];
|
|
||||||
}
|
|
Reference in New Issue
Block a user