diff --git a/wcfsetup/install/files/lib/action/UserIgnoreAction.class.php b/wcfsetup/install/files/lib/action/UserIgnoreAction.class.php index 3cdb22357a4..c3b8a3fe56b 100644 --- a/wcfsetup/install/files/lib/action/UserIgnoreAction.class.php +++ b/wcfsetup/install/files/lib/action/UserIgnoreAction.class.php @@ -6,11 +6,13 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; +use wcf\command\user\IgnoreUser; +use wcf\command\user\UnignoreUser; use wcf\data\user\ignore\UserIgnore; -use wcf\data\user\ignore\UserIgnoreAction as IgnoreUserIgnoreAction; use wcf\data\user\UserProfile; use wcf\http\Helper; use wcf\system\cache\runtime\UserProfileRuntimeCache; +use wcf\system\cache\runtime\UserRuntimeCache; use wcf\system\exception\IllegalLinkException; use wcf\system\exception\PermissionDeniedException; use wcf\system\form\builder\field\RadioButtonFormField; @@ -61,19 +63,11 @@ public function handle(ServerRequestInterface $request): ResponseInterface $type = \intval($form->getData()['data']['type']); + $user = UserRuntimeCache::getInstance()->getObject($parameters['id']); if ($type === UserIgnore::TYPE_NO_IGNORE) { - (new IgnoreUserIgnoreAction([], 'unignore', [ - 'data' => [ - 'userID' => $parameters['id'], - ], - ]))->executeAction(); + (new UnignoreUser(WCF::getUser(), $user))(); } else { - (new IgnoreUserIgnoreAction([], 'ignore', [ - 'data' => [ - 'userID' => $parameters['id'], - 'type' => $type, - ], - ]))->executeAction(); + (new IgnoreUser(WCF::getUser(), $user, $type))(); } return new JsonResponse([ diff --git a/wcfsetup/install/files/lib/command/user/IgnoreUser.class.php b/wcfsetup/install/files/lib/command/user/IgnoreUser.class.php new file mode 100644 index 00000000000..2e6b8a097c0 --- /dev/null +++ b/wcfsetup/install/files/lib/command/user/IgnoreUser.class.php @@ -0,0 +1,61 @@ + + * @since 6.3 + */ +final class IgnoreUser +{ + public function __construct( + private readonly User $user, + private readonly User $target, + /** @var UserIgnore::TYPE_BLOCK_DIRECT_CONTACT|UserIgnore::TYPE_HIDE_MESSAGES */ + private readonly int $type + ) {} + + public function __invoke(): void + { + $this->ignoreUser($this->user, $this->target, $this->type); + + (new Unfollow($this->target, $this->user))(); + + $this->resetStorage($this->user, $this->target); + + $event = new UserIgnored($this->user, $this->target, $this->type); + EventHandler::getInstance()->fire($event); + } + + private function resetStorage(User $user, User $target): void + { + UserStorageHandler::getInstance()->reset([$user->userID], 'ignoredUserIDs'); + UserStorageHandler::getInstance()->reset([$target->userID], 'ignoredByUserIDs'); + } + + private function ignoreUser(User $user, User $target, int $type): void + { + $sql = "INSERT INTO wcf1_user_ignore + (userID, ignoreUserID, type, time) + VALUES (?, ?, ?, ?) + ON DUPLICATE KEY UPDATE type = VALUES(type), time = VALUES(time)"; + $statement = WCF::getDB()->prepare($sql); + $statement->execute([ + $user->userID, + $target->userID, + $type, + TIME_NOW, + ]); + } +} diff --git a/wcfsetup/install/files/lib/command/user/UnignoreUser.class.php b/wcfsetup/install/files/lib/command/user/UnignoreUser.class.php new file mode 100644 index 00000000000..61af7fd3d7c --- /dev/null +++ b/wcfsetup/install/files/lib/command/user/UnignoreUser.class.php @@ -0,0 +1,45 @@ + + * @since 6.3 + */ +final class UnignoreUser +{ + public function __construct( + private readonly User $user, + private readonly User $target, + ) {} + + public function __invoke(): void + { + $this->removeUserIgnore($this->user, $this->target); + + UserStorageHandler::getInstance()->reset([$this->user->userID], 'ignoredUserIDs'); + UserStorageHandler::getInstance()->reset([$this->target->userID], 'ignoredByUserIDs'); + + $event = new UserUnignored($this->user, $this->target); + EventHandler::getInstance()->fire($event); + } + + private function removeUserIgnore(User $user, User $target): void + { + $sql = "DELETE FROM wcf1_user_ignore + WHERE userID = ? + AND ignoreUserID = ?"; + $statement = WCF::getDB()->prepare($sql); + $statement->execute([$user->userID, $target->userID]); + } +} diff --git a/wcfsetup/install/files/lib/data/user/ignore/UserIgnoreAction.class.php b/wcfsetup/install/files/lib/data/user/ignore/UserIgnoreAction.class.php index dd20313cd5e..3acbdfadb90 100644 --- a/wcfsetup/install/files/lib/data/user/ignore/UserIgnoreAction.class.php +++ b/wcfsetup/install/files/lib/data/user/ignore/UserIgnoreAction.class.php @@ -2,9 +2,9 @@ namespace wcf\data\user\ignore; +use wcf\command\user\IgnoreUser; +use wcf\command\user\UnignoreUser; use wcf\data\AbstractDatabaseObjectAction; -use wcf\data\user\follow\UserFollow; -use wcf\data\user\follow\UserFollowEditor; use wcf\system\cache\runtime\UserProfileRuntimeCache; use wcf\system\exception\IllegalLinkException; use wcf\system\exception\PermissionDeniedException; @@ -38,6 +38,8 @@ class UserIgnoreAction extends AbstractDatabaseObjectAction * Validates the 'ignore' action. * * @return void + * + * @deprecated 6.3 */ public function validateIgnore() { @@ -70,53 +72,15 @@ public function validateIgnore() * Ignores a user. * * @return array{isIgnoredUser: 1} + * + * @deprecated 6.3 use the `IgnoreUser` command instead. */ public function ignore() { - $ignore = new UserIgnoreEditor(UserIgnore::getIgnore($this->parameters['data']['userID'])); $type = $this->parameters['data']['type'] ?? UserIgnore::TYPE_BLOCK_DIRECT_CONTACT; + $userProfile = UserProfileRuntimeCache::getInstance()->getObject($this->parameters['data']['userID']); - if ($ignore->ignoreID) { - $ignore->update([ - 'type' => $type, - 'time' => TIME_NOW, - ]); - } else { - $ignore = UserIgnoreEditor::createOrIgnore([ - 'ignoreUserID' => $this->parameters['data']['userID'], - 'type' => $type, - 'time' => TIME_NOW, - 'userID' => WCF::getUser()->userID, - ]); - } - - if ($ignore !== null) { - UserStorageHandler::getInstance()->reset([WCF::getUser()->userID], 'ignoredUserIDs'); - UserStorageHandler::getInstance()->reset([$this->parameters['data']['userID']], 'ignoredByUserIDs'); - - // check if target user is following the current user - $sql = "SELECT * - FROM wcf1_user_follow - WHERE userID = ? - AND followUserID = ?"; - $statement = WCF::getDB()->prepare($sql); - $statement->execute([ - $this->parameters['data']['userID'], - WCF::getUser()->userID, - ]); - - $follow = $statement->fetchObject(UserFollow::class); - - // remove follower - if ($follow !== null) { - $followEditor = new UserFollowEditor($follow); - $followEditor->delete(); - - // reset storage - UserStorageHandler::getInstance()->reset([WCF::getUser()->userID], 'followerUserIDs'); - UserStorageHandler::getInstance()->reset([$this->parameters['data']['userID']], 'followingUserIDs'); - } - } + (new IgnoreUser(WCF::getUser(), $userProfile->getDecoratedObject(), $type))(); return ['isIgnoredUser' => 1]; } @@ -125,6 +89,8 @@ public function ignore() * Validates the 'unignore' action. * * @return void + * + * @deprecated 6.3 */ public function validateUnignore() { @@ -140,18 +106,14 @@ public function validateUnignore() * Unignores a user. * * @return array{isIgnoredUser: 0} + * + * @deprecated 6.3 use the `UnignoreUser` command instead. */ public function unignore() { - $ignore = UserIgnore::getIgnore($this->parameters['data']['userID']); - - if ($ignore->ignoreID) { - $ignoreEditor = new UserIgnoreEditor($ignore); - $ignoreEditor->delete(); + $userProfile = UserProfileRuntimeCache::getInstance()->getObject($this->parameters['data']['userID']); - UserStorageHandler::getInstance()->reset([WCF::getUser()->userID], 'ignoredUserIDs'); - UserStorageHandler::getInstance()->reset([$this->parameters['data']['userID']], 'ignoredByUserIDs'); - } + (new UnignoreUser(WCF::getUser(), $userProfile->getDecoratedObject()))(); return ['isIgnoredUser' => 0]; } diff --git a/wcfsetup/install/files/lib/event/user/UserIgnored.class.php b/wcfsetup/install/files/lib/event/user/UserIgnored.class.php new file mode 100644 index 00000000000..1fd5b4d97cb --- /dev/null +++ b/wcfsetup/install/files/lib/event/user/UserIgnored.class.php @@ -0,0 +1,23 @@ + + * @since 6.3 + */ +final class UserIgnored implements IPsr14Event +{ + public function __construct( + public readonly User $user, + public readonly User $target, + public readonly int $type, + ) {} +} diff --git a/wcfsetup/install/files/lib/event/user/UserUnignored.class.php b/wcfsetup/install/files/lib/event/user/UserUnignored.class.php new file mode 100644 index 00000000000..b77222916fd --- /dev/null +++ b/wcfsetup/install/files/lib/event/user/UserUnignored.class.php @@ -0,0 +1,22 @@ + + * @since 6.3 + */ +final class UserUnignored implements IPsr14Event +{ + public function __construct( + public readonly User $user, + public readonly User $target, + ) {} +} diff --git a/wcfsetup/install/files/lib/system/user/command/Unfollow.class.php b/wcfsetup/install/files/lib/system/user/command/Unfollow.class.php index 0c01f98e2d0..c5f624ba355 100644 --- a/wcfsetup/install/files/lib/system/user/command/Unfollow.class.php +++ b/wcfsetup/install/files/lib/system/user/command/Unfollow.class.php @@ -18,9 +18,10 @@ */ final class Unfollow { - public function __construct(private readonly User $user, private readonly User $target) - { - } + public function __construct( + private readonly User $user, + private readonly User $target, + ) {} public function __invoke(): void {