mirror of
https://github.com/flarum/core.git
synced 2025-07-17 14:51:19 +02:00
Get rid of event subscribers that resolve services too early
Refs flarum/core#1578.
This commit is contained in:
@@ -9,9 +9,20 @@
|
|||||||
* file that was distributed with this source code.
|
* file that was distributed with this source code.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use Flarum\Api\Event\Serializing;
|
||||||
|
use Flarum\Api\Serializer\BasicDiscussionSerializer;
|
||||||
|
use Flarum\Discussion\Event\Saving;
|
||||||
|
use Flarum\Event\ConfigureDiscussionGambits;
|
||||||
|
use Flarum\Event\ConfigureNotificationTypes;
|
||||||
|
use Flarum\Event\ConfigurePostTypes;
|
||||||
use Flarum\Extend;
|
use Flarum\Extend;
|
||||||
use Flarum\Lock\Access;
|
use Flarum\Lock\Access;
|
||||||
|
use Flarum\Lock\Event\DiscussionWasLocked;
|
||||||
|
use Flarum\Lock\Event\DiscussionWasUnlocked;
|
||||||
|
use Flarum\Lock\Gambit\LockedGambit;
|
||||||
use Flarum\Lock\Listener;
|
use Flarum\Lock\Listener;
|
||||||
|
use Flarum\Lock\Notification\DiscussionLockedBlueprint;
|
||||||
|
use Flarum\Lock\Post\DiscussionLockedPost;
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
use Illuminate\Contracts\Events\Dispatcher;
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@@ -23,10 +34,20 @@ return [
|
|||||||
->js(__DIR__.'/js/dist/admin.js'),
|
->js(__DIR__.'/js/dist/admin.js'),
|
||||||
|
|
||||||
function (Dispatcher $events) {
|
function (Dispatcher $events) {
|
||||||
$events->subscribe(Listener\AddDiscussionLockedAttributes::class);
|
$events->listen(ConfigureDiscussionGambits::class, function (ConfigureDiscussionGambits $event) {
|
||||||
$events->subscribe(Listener\AddLockedGambit::class);
|
$event->gambits->add(LockedGambit::class);
|
||||||
$events->subscribe(Listener\CreatePostWhenDiscussionIsLocked::class);
|
});
|
||||||
$events->subscribe(Listener\SaveLockedToDatabase::class);
|
$events->listen(Serializing::class, Listener\AddDiscussionLockedAttributes::class);
|
||||||
|
$events->listen(Saving::class, Listener\SaveLockedToDatabase::class);
|
||||||
|
|
||||||
|
$events->listen(ConfigurePostTypes::class, function (ConfigurePostTypes $event) {
|
||||||
|
$event->add(DiscussionLockedPost::class);
|
||||||
|
});
|
||||||
|
$events->listen(ConfigureNotificationTypes::class, function (ConfigureNotificationTypes $event) {
|
||||||
|
$event->add(DiscussionLockedBlueprint::class, BasicDiscussionSerializer::class, ['alert']);
|
||||||
|
});
|
||||||
|
$events->listen(DiscussionWasLocked::class, Listener\CreatePostWhenDiscussionIsLocked::class);
|
||||||
|
$events->listen(DiscussionWasUnlocked::class, Listener\CreatePostWhenDiscussionIsUnlocked::class);
|
||||||
|
|
||||||
$events->subscribe(Access\DiscussionPolicy::class);
|
$events->subscribe(Access\DiscussionPolicy::class);
|
||||||
},
|
},
|
||||||
|
@@ -13,22 +13,10 @@ namespace Flarum\Lock\Listener;
|
|||||||
|
|
||||||
use Flarum\Api\Event\Serializing;
|
use Flarum\Api\Event\Serializing;
|
||||||
use Flarum\Api\Serializer\DiscussionSerializer;
|
use Flarum\Api\Serializer\DiscussionSerializer;
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
|
||||||
|
|
||||||
class AddDiscussionLockedAttributes
|
class AddDiscussionLockedAttributes
|
||||||
{
|
{
|
||||||
/**
|
public function handle(Serializing $event)
|
||||||
* @param Dispatcher $events
|
|
||||||
*/
|
|
||||||
public function subscribe(Dispatcher $events)
|
|
||||||
{
|
|
||||||
$events->listen(Serializing::class, [$this, 'prepareApiAttributes']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Serializing $event
|
|
||||||
*/
|
|
||||||
public function prepareApiAttributes(Serializing $event)
|
|
||||||
{
|
{
|
||||||
if ($event->isSerializer(DiscussionSerializer::class)) {
|
if ($event->isSerializer(DiscussionSerializer::class)) {
|
||||||
$event->attributes['isLocked'] = (bool) $event->model->is_locked;
|
$event->attributes['isLocked'] = (bool) $event->model->is_locked;
|
||||||
|
@@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Flarum.
|
|
||||||
*
|
|
||||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Flarum\Lock\Listener;
|
|
||||||
|
|
||||||
use Flarum\Event\ConfigureDiscussionGambits;
|
|
||||||
use Flarum\Lock\Gambit\LockedGambit;
|
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
|
||||||
|
|
||||||
class AddLockedGambit
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @param Dispatcher $events
|
|
||||||
*/
|
|
||||||
public function subscribe(Dispatcher $events)
|
|
||||||
{
|
|
||||||
$events->listen(ConfigureDiscussionGambits::class, [$this, 'configureDiscussionGambits']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ConfigureDiscussionGambits $event
|
|
||||||
*/
|
|
||||||
public function configureDiscussionGambits(ConfigureDiscussionGambits $event)
|
|
||||||
{
|
|
||||||
$event->gambits->add(LockedGambit::class);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -11,17 +11,10 @@
|
|||||||
|
|
||||||
namespace Flarum\Lock\Listener;
|
namespace Flarum\Lock\Listener;
|
||||||
|
|
||||||
use Flarum\Api\Serializer\BasicDiscussionSerializer;
|
|
||||||
use Flarum\Discussion\Discussion;
|
|
||||||
use Flarum\Event\ConfigureNotificationTypes;
|
|
||||||
use Flarum\Event\ConfigurePostTypes;
|
|
||||||
use Flarum\Lock\Event\DiscussionWasLocked;
|
use Flarum\Lock\Event\DiscussionWasLocked;
|
||||||
use Flarum\Lock\Event\DiscussionWasUnlocked;
|
|
||||||
use Flarum\Lock\Notification\DiscussionLockedBlueprint;
|
use Flarum\Lock\Notification\DiscussionLockedBlueprint;
|
||||||
use Flarum\Lock\Post\DiscussionLockedPost;
|
use Flarum\Lock\Post\DiscussionLockedPost;
|
||||||
use Flarum\Notification\NotificationSyncer;
|
use Flarum\Notification\NotificationSyncer;
|
||||||
use Flarum\User\User;
|
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
|
||||||
|
|
||||||
class CreatePostWhenDiscussionIsLocked
|
class CreatePostWhenDiscussionIsLocked
|
||||||
{
|
{
|
||||||
@@ -30,76 +23,25 @@ class CreatePostWhenDiscussionIsLocked
|
|||||||
*/
|
*/
|
||||||
protected $notifications;
|
protected $notifications;
|
||||||
|
|
||||||
/**
|
|
||||||
* @param NotificationSyncer $notifications
|
|
||||||
*/
|
|
||||||
public function __construct(NotificationSyncer $notifications)
|
public function __construct(NotificationSyncer $notifications)
|
||||||
{
|
{
|
||||||
$this->notifications = $notifications;
|
$this->notifications = $notifications;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function handle(DiscussionWasLocked $event)
|
||||||
* @param Dispatcher $events
|
|
||||||
*/
|
|
||||||
public function subscribe(Dispatcher $events)
|
|
||||||
{
|
|
||||||
$events->listen(ConfigurePostTypes::class, [$this, 'addPostType']);
|
|
||||||
$events->listen(ConfigureNotificationTypes::class, [$this, 'addNotificationType']);
|
|
||||||
$events->listen(DiscussionWasLocked::class, [$this, 'whenDiscussionWasLocked']);
|
|
||||||
$events->listen(DiscussionWasUnlocked::class, [$this, 'whenDiscussionWasUnlocked']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ConfigurePostTypes $event
|
|
||||||
*/
|
|
||||||
public function addPostType(ConfigurePostTypes $event)
|
|
||||||
{
|
|
||||||
$event->add(DiscussionLockedPost::class);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ConfigureNotificationTypes $event
|
|
||||||
*/
|
|
||||||
public function addNotificationType(ConfigureNotificationTypes $event)
|
|
||||||
{
|
|
||||||
$event->add(DiscussionLockedBlueprint::class, BasicDiscussionSerializer::class, ['alert']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param DiscussionWasLocked $event
|
|
||||||
*/
|
|
||||||
public function whenDiscussionWasLocked(DiscussionWasLocked $event)
|
|
||||||
{
|
|
||||||
$this->lockedChanged($event->discussion, $event->user, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param DiscussionWasUnlocked $event
|
|
||||||
*/
|
|
||||||
public function whenDiscussionWasUnlocked(DiscussionWasUnlocked $event)
|
|
||||||
{
|
|
||||||
$this->lockedChanged($event->discussion, $event->user, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Discussion $discussion
|
|
||||||
* @param User $user
|
|
||||||
* @param $isLocked
|
|
||||||
*/
|
|
||||||
protected function lockedChanged(Discussion $discussion, User $user, $isLocked)
|
|
||||||
{
|
{
|
||||||
$post = DiscussionLockedPost::reply(
|
$post = DiscussionLockedPost::reply(
|
||||||
$discussion->id,
|
$event->discussion->id,
|
||||||
$user->id,
|
$event->user->id,
|
||||||
$isLocked
|
true
|
||||||
);
|
);
|
||||||
|
|
||||||
$post = $discussion->mergePost($post);
|
$post = $event->discussion->mergePost($post);
|
||||||
|
|
||||||
if ($discussion->user_id !== $user->id) {
|
if ($event->discussion->user_id !== $event->user->id) {
|
||||||
$notification = new DiscussionLockedBlueprint($post);
|
$notification = new DiscussionLockedBlueprint($post);
|
||||||
|
|
||||||
$this->notifications->sync($notification, $post->exists ? [$discussion->user] : []);
|
$this->notifications->sync($notification, $post->exists ? [$event->discussion->user] : []);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
47
extensions/lock/src/Listener/CreatePostWhenDiscussionIsUnlocked.php
Executable file
47
extensions/lock/src/Listener/CreatePostWhenDiscussionIsUnlocked.php
Executable file
@@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Flarum.
|
||||||
|
*
|
||||||
|
* (c) Toby Zerner <toby.zerner@gmail.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Flarum\Lock\Listener;
|
||||||
|
|
||||||
|
use Flarum\Lock\Event\DiscussionWasUnlocked;
|
||||||
|
use Flarum\Lock\Notification\DiscussionLockedBlueprint;
|
||||||
|
use Flarum\Lock\Post\DiscussionLockedPost;
|
||||||
|
use Flarum\Notification\NotificationSyncer;
|
||||||
|
|
||||||
|
class CreatePostWhenDiscussionIsUnlocked
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var NotificationSyncer
|
||||||
|
*/
|
||||||
|
protected $notifications;
|
||||||
|
|
||||||
|
public function __construct(NotificationSyncer $notifications)
|
||||||
|
{
|
||||||
|
$this->notifications = $notifications;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function handle(DiscussionWasUnlocked $event)
|
||||||
|
{
|
||||||
|
$post = DiscussionLockedPost::reply(
|
||||||
|
$event->discussion->id,
|
||||||
|
$event->user->id,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
|
||||||
|
$post = $event->discussion->mergePost($post);
|
||||||
|
|
||||||
|
if ($event->discussion->user_id !== $event->user->id) {
|
||||||
|
$notification = new DiscussionLockedBlueprint($post);
|
||||||
|
|
||||||
|
$this->notifications->sync($notification, $post->exists ? [$event->discussion->user] : []);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -15,24 +15,12 @@ use Flarum\Discussion\Event\Saving;
|
|||||||
use Flarum\Lock\Event\DiscussionWasLocked;
|
use Flarum\Lock\Event\DiscussionWasLocked;
|
||||||
use Flarum\Lock\Event\DiscussionWasUnlocked;
|
use Flarum\Lock\Event\DiscussionWasUnlocked;
|
||||||
use Flarum\User\AssertPermissionTrait;
|
use Flarum\User\AssertPermissionTrait;
|
||||||
use Illuminate\Contracts\Events\Dispatcher;
|
|
||||||
|
|
||||||
class SaveLockedToDatabase
|
class SaveLockedToDatabase
|
||||||
{
|
{
|
||||||
use AssertPermissionTrait;
|
use AssertPermissionTrait;
|
||||||
|
|
||||||
/**
|
public function handle(Saving $event)
|
||||||
* @param Dispatcher $events
|
|
||||||
*/
|
|
||||||
public function subscribe(Dispatcher $events)
|
|
||||||
{
|
|
||||||
$events->listen(Saving::class, [$this, 'whenSaving']);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Saving $event
|
|
||||||
*/
|
|
||||||
public function whenSaving(Saving $event)
|
|
||||||
{
|
{
|
||||||
if (isset($event->data['attributes']['isLocked'])) {
|
if (isset($event->data['attributes']['isLocked'])) {
|
||||||
$isLocked = (bool) $event->data['attributes']['isLocked'];
|
$isLocked = (bool) $event->data['attributes']['isLocked'];
|
||||||
|
Reference in New Issue
Block a user