diff options
author | Joas Schilling <213943+nickvergessen@users.noreply.github.com> | 2024-04-18 10:05:49 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-18 10:05:49 +0200 |
commit | 2161387ac751b070a93e7eb8f38d006093703b0d (patch) | |
tree | 5f3862e206b4364f790534b13f100c0370c0e0a6 /lib/public | |
parent | b75bb088d16d06178f1626990ec4c7e0c911596c (diff) | |
parent | 17744f8590513e6a1d0e2a19a101b5f6e7332fcc (diff) | |
download | nextcloud-server-2161387ac751b070a93e7eb8f38d006093703b0d.tar.gz nextcloud-server-2161387ac751b070a93e7eb8f38d006093703b0d.zip |
Merge pull request #44886 from nextcloud/techdebt/noid/improved-activity-exceptions
fix(activity): Improved activity exceptions
Diffstat (limited to 'lib/public')
-rw-r--r-- | lib/public/Activity/Exceptions/FilterNotFoundException.php | 48 | ||||
-rw-r--r-- | lib/public/Activity/Exceptions/IncompleteActivityException.php | 43 | ||||
-rw-r--r-- | lib/public/Activity/Exceptions/InvalidValueException.php | 49 | ||||
-rw-r--r-- | lib/public/Activity/Exceptions/SettingNotFoundException.php | 48 | ||||
-rw-r--r-- | lib/public/Activity/Exceptions/UnknownActivityException.php | 33 | ||||
-rw-r--r-- | lib/public/Activity/IEvent.php | 50 | ||||
-rw-r--r-- | lib/public/Activity/IManager.php | 14 | ||||
-rw-r--r-- | lib/public/Activity/IProvider.php | 7 |
8 files changed, 270 insertions, 22 deletions
diff --git a/lib/public/Activity/Exceptions/FilterNotFoundException.php b/lib/public/Activity/Exceptions/FilterNotFoundException.php new file mode 100644 index 00000000000..5988bcc6200 --- /dev/null +++ b/lib/public/Activity/Exceptions/FilterNotFoundException.php @@ -0,0 +1,48 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2024 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Activity\Exceptions; + +/** + * @since 30.0.0 + */ +class FilterNotFoundException extends \InvalidArgumentException { + /** + * @since 30.0.0 + */ + public function __construct( + protected string $filter, + ) { + parent::__construct('Filter ' . $filter . ' not found'); + } + + /** + * @since 30.0.0 + */ + public function getFilterId(): string { + return $this->filter; + } +} diff --git a/lib/public/Activity/Exceptions/IncompleteActivityException.php b/lib/public/Activity/Exceptions/IncompleteActivityException.php new file mode 100644 index 00000000000..14cb6e7e5d6 --- /dev/null +++ b/lib/public/Activity/Exceptions/IncompleteActivityException.php @@ -0,0 +1,43 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2024 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Activity\Exceptions; + +/** + * Thrown when {@see \OCP\Notification\IManager::notify()} is called with a notification + * that does not have all required fields set: + * + * - app + * - type + * - affectedUser + * - subject + * - objectType + * - objectId + * + * @since 30.0.0 + */ +class IncompleteActivityException extends \BadMethodCallException { +} diff --git a/lib/public/Activity/Exceptions/InvalidValueException.php b/lib/public/Activity/Exceptions/InvalidValueException.php new file mode 100644 index 00000000000..24d0d12bb12 --- /dev/null +++ b/lib/public/Activity/Exceptions/InvalidValueException.php @@ -0,0 +1,49 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2024 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Activity\Exceptions; + +/** + * @since 30.0.0 + */ +class InvalidValueException extends \InvalidArgumentException { + /** + * @since 30.0.0 + */ + public function __construct( + protected string $field, + ?\Throwable $previous = null, + ) { + parent::__construct('Value provided for ' . $field . ' is not valid', previous: $previous); + } + + /** + * @since 30.0.0 + */ + public function getFieldIdentifier(): string { + return $this->field; + } +} diff --git a/lib/public/Activity/Exceptions/SettingNotFoundException.php b/lib/public/Activity/Exceptions/SettingNotFoundException.php new file mode 100644 index 00000000000..e4b87266143 --- /dev/null +++ b/lib/public/Activity/Exceptions/SettingNotFoundException.php @@ -0,0 +1,48 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2024 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Activity\Exceptions; + +/** + * @since 30.0.0 + */ +class SettingNotFoundException extends \InvalidArgumentException { + /** + * @since 30.0.0 + */ + public function __construct( + protected string $setting, + ) { + parent::__construct('Setting ' . $setting . ' not found'); + } + + /** + * @since 30.0.0 + */ + public function getSettingId(): string { + return $this->setting; + } +} diff --git a/lib/public/Activity/Exceptions/UnknownActivityException.php b/lib/public/Activity/Exceptions/UnknownActivityException.php new file mode 100644 index 00000000000..c32e5b8450c --- /dev/null +++ b/lib/public/Activity/Exceptions/UnknownActivityException.php @@ -0,0 +1,33 @@ +<?php + +declare(strict_types=1); + +/** + * @copyright Copyright (c) 2024 Joas Schilling <coding@schilljs.com> + * + * @author Joas Schilling <coding@schilljs.com> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\Activity\Exceptions; + +/** + * @since 30.0.0 + */ +class UnknownActivityException extends \InvalidArgumentException { +} diff --git a/lib/public/Activity/IEvent.php b/lib/public/Activity/IEvent.php index 4c47cc47a3f..5ca8ce15a21 100644 --- a/lib/public/Activity/IEvent.php +++ b/lib/public/Activity/IEvent.php @@ -30,6 +30,8 @@ declare(strict_types=1); namespace OCP\Activity; +use OCP\Activity\Exceptions\InvalidValueException; + /** * Interface IEvent * @@ -41,8 +43,9 @@ interface IEvent { * * @param string $app * @return IEvent - * @throws \InvalidArgumentException if the app id is invalid + * @throws InvalidValueException if the app id is invalid * @since 8.2.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setApp(string $app): self; @@ -51,28 +54,31 @@ interface IEvent { * * @param string $type * @return IEvent - * @throws \InvalidArgumentException if the type is invalid + * @throws InvalidValueException if the type is invalid * @since 8.2.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setType(string $type): self; /** * Set the affected user of the activity * - * @param string $user + * @param string $affectedUser * @return IEvent - * @throws \InvalidArgumentException if the affected user is invalid + * @throws InvalidValueException if the affected user is invalid * @since 8.2.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ - public function setAffectedUser(string $user): self; + public function setAffectedUser(string $affectedUser): self; /** * Set the author of the activity * * @param string $author * @return IEvent - * @throws \InvalidArgumentException if the author is invalid + * @throws InvalidValueException if the author is invalid * @since 8.2.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setAuthor(string $author): self; @@ -81,8 +87,9 @@ interface IEvent { * * @param int $timestamp * @return IEvent - * @throws \InvalidArgumentException if the timestamp is invalid + * @throws InvalidValueException if the timestamp is invalid * @since 8.2.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setTimestamp(int $timestamp): self; @@ -92,8 +99,9 @@ interface IEvent { * @param string $subject * @param array $parameters * @return IEvent - * @throws \InvalidArgumentException if the subject or parameters are invalid + * @throws InvalidValueException if the subject or parameters are invalid * @since 8.2.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setSubject(string $subject, array $parameters = []): self; @@ -109,8 +117,9 @@ interface IEvent { * * @param string $subject * @return $this - * @throws \InvalidArgumentException if the subject is invalid + * @throws InvalidValueException if the subject is invalid * @since 11.0.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setParsedSubject(string $subject): self; @@ -132,8 +141,9 @@ interface IEvent { * @param string $subject * @param array $parameters * @return $this - * @throws \InvalidArgumentException if the subject or parameters are invalid + * @throws InvalidValueException if the subject or parameters are invalid * @since 11.0.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setRichSubject(string $subject, array $parameters = []): self; @@ -155,8 +165,9 @@ interface IEvent { * @param string $message * @param array $parameters * @return IEvent - * @throws \InvalidArgumentException if the message or parameters are invalid + * @throws InvalidValueException if the message or parameters are invalid * @since 8.2.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setMessage(string $message, array $parameters = []): self; @@ -172,8 +183,9 @@ interface IEvent { * * @param string $message * @return $this - * @throws \InvalidArgumentException if the message is invalid + * @throws InvalidValueException if the message is invalid * @since 11.0.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setParsedMessage(string $message): self; @@ -197,6 +209,7 @@ interface IEvent { * @return $this * @throws \InvalidArgumentException if the message or parameters are invalid * @since 11.0.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setRichMessage(string $message, array $parameters = []): self; @@ -219,8 +232,9 @@ interface IEvent { * @param int $objectId * @param string $objectName * @return IEvent - * @throws \InvalidArgumentException if the object is invalid + * @throws InvalidValueException if the object is invalid * @since 8.2.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setObject(string $objectType, int $objectId, string $objectName = ''): self; @@ -229,8 +243,9 @@ interface IEvent { * * @param string $link * @return IEvent - * @throws \InvalidArgumentException if the link is invalid + * @throws InvalidValueException if the link is invalid * @since 8.2.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setLink(string $link): self; @@ -315,8 +330,9 @@ interface IEvent { /** * @param string $icon * @return $this - * @throws \InvalidArgumentException if the icon is invalid + * @throws InvalidValueException if the icon is invalid * @since 11.0.0 + * @since 30.0.0 throws {@see InvalidValueException} instead of \InvalidArgumentException */ public function setIcon(string $icon): self; @@ -352,7 +368,7 @@ interface IEvent { public function isValidParsed(): bool; /** - * Set whether or not a notification should be automatically generated for this activity. + * Set whether a notification should be automatically generated for this activity. * * Set this to `false` if the app already generates a notification for the event. * @@ -363,7 +379,7 @@ interface IEvent { public function setGenerateNotification(bool $generate): self; /** - * whether or not a notification should be automatically generated for this activity. + * Whether a notification should be automatically generated for this activity. * * @return bool * @since 20.0.0 diff --git a/lib/public/Activity/IManager.php b/lib/public/Activity/IManager.php index 8340b54f757..06b2ef27259 100644 --- a/lib/public/Activity/IManager.php +++ b/lib/public/Activity/IManager.php @@ -28,6 +28,10 @@ declare(strict_types=1); */ namespace OCP\Activity; +use OCP\Activity\Exceptions\FilterNotFoundException; +use OCP\Activity\Exceptions\IncompleteActivityException; +use OCP\Activity\Exceptions\SettingNotFoundException; + /** * Interface IManager * @@ -61,8 +65,9 @@ interface IManager { * - setObject() * * @param IEvent $event - * @throws \BadMethodCallException if required values have not been set + * @throws IncompleteActivityException if required values have not been set * @since 8.2.0 + * @since 30.0.0 throws {@see IncompleteActivityException} instead of \BadMethodCallException */ public function publish(IEvent $event): void; @@ -92,8 +97,9 @@ interface IManager { /** * @param string $id * @return IFilter - * @throws \InvalidArgumentException when the filter was not found + * @throws FilterNotFoundException when the filter was not found * @since 11.0.0 + * @since 30.0.0 throws {@see FilterNotFoundException} instead of \InvalidArgumentException */ public function getFilterById(string $id): IFilter; @@ -124,8 +130,9 @@ interface IManager { /** * @param string $id * @return ActivitySettings - * @throws \InvalidArgumentException when the setting was not found + * @throws SettingNotFoundException when the setting was not found * @since 11.0.0 + * @since 30.0.0 throws {@see SettingNotFoundException} instead of \InvalidArgumentException */ public function getSettingById(string $id): ActivitySettings; @@ -158,7 +165,6 @@ interface IManager { * Set the user we need to use * * @param string|null $currentUserId - * @throws \UnexpectedValueException If the user is invalid * @since 9.0.1 */ public function setCurrentUserId(?string $currentUserId = null): void; diff --git a/lib/public/Activity/IProvider.php b/lib/public/Activity/IProvider.php index 9c032ebaec2..ce1934ef2df 100644 --- a/lib/public/Activity/IProvider.php +++ b/lib/public/Activity/IProvider.php @@ -22,6 +22,8 @@ */ namespace OCP\Activity; +use OCP\Activity\Exceptions\UnknownActivityException; + /** * Interface IProvider * @@ -35,8 +37,11 @@ interface IProvider { * To do so, simply use setChildEvent($previousEvent) after setting the * combined subject on the current event. * @return IEvent - * @throws \InvalidArgumentException Should be thrown if your provider does not know this event + * @throws UnknownActivityException Should be thrown if your provider does not know this event * @since 11.0.0 + * @since 30.0.0 Providers should throw {@see UnknownActivityException} instead of \InvalidArgumentException + * when they did not handle the event. Throwing \InvalidArgumentException directly is deprecated and will + * be logged as an error in Nextcloud 39. */ public function parse($language, IEvent $event, ?IEvent $previousEvent = null); } |