diff options
author | Morris Jobke <hey@morrisjobke.de> | 2019-07-17 20:22:03 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-17 20:22:03 +0200 |
commit | 5b604eaeaba7d5ee5dd12a92f37c9e8e7519c9c2 (patch) | |
tree | a507ff70a162b7c779a62faa1f341ec025539b9f /lib | |
parent | 782554d2acdfd48b322753500906e8b291035250 (diff) | |
parent | 594efca1e3b936d0d86f2d80ebf366980a425713 (diff) | |
download | nextcloud-server-5b604eaeaba7d5ee5dd12a92f37c9e8e7519c9c2.tar.gz nextcloud-server-5b604eaeaba7d5ee5dd12a92f37c9e8e7519c9c2.zip |
Merge pull request #15040 from nextcloud/feature/13980/push-for-deleted-notifications
Notifications overhaul
Diffstat (limited to 'lib')
-rw-r--r-- | lib/composer/composer/autoload_classmap.php | 1 | ||||
-rw-r--r-- | lib/composer/composer/autoload_static.php | 1 | ||||
-rw-r--r-- | lib/private/Authentication/Listeners/RemoteWipeNotificationsListener.php | 2 | ||||
-rw-r--r-- | lib/private/Authentication/Notifications/Notifier.php | 21 | ||||
-rw-r--r-- | lib/private/Notification/Action.php | 45 | ||||
-rw-r--r-- | lib/private/Notification/Manager.php | 172 | ||||
-rw-r--r-- | lib/private/Notification/Notification.php | 112 | ||||
-rw-r--r-- | lib/private/Server.php | 3 | ||||
-rw-r--r-- | lib/public/Notification/AlreadyProcessedException.php | 38 | ||||
-rw-r--r-- | lib/public/Notification/IAction.php | 47 | ||||
-rw-r--r-- | lib/public/Notification/IApp.php | 7 | ||||
-rw-r--r-- | lib/public/Notification/IManager.php | 29 | ||||
-rw-r--r-- | lib/public/Notification/INotification.php | 78 | ||||
-rw-r--r-- | lib/public/Notification/INotifier.php | 21 |
14 files changed, 355 insertions, 222 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 1fa9f6243f9..d8d9227cb07 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -347,6 +347,7 @@ return array( 'OCP\\Migration\\IOutput' => $baseDir . '/lib/public/Migration/IOutput.php', 'OCP\\Migration\\IRepairStep' => $baseDir . '/lib/public/Migration/IRepairStep.php', 'OCP\\Migration\\SimpleMigrationStep' => $baseDir . '/lib/public/Migration/SimpleMigrationStep.php', + 'OCP\\Notification\\AlreadyProcessedException' => $baseDir . '/lib/public/Notification/AlreadyProcessedException.php', 'OCP\\Notification\\IAction' => $baseDir . '/lib/public/Notification/IAction.php', 'OCP\\Notification\\IApp' => $baseDir . '/lib/public/Notification/IApp.php', 'OCP\\Notification\\IManager' => $baseDir . '/lib/public/Notification/IManager.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 58c1b031f90..043846e04df 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -381,6 +381,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\Migration\\IOutput' => __DIR__ . '/../../..' . '/lib/public/Migration/IOutput.php', 'OCP\\Migration\\IRepairStep' => __DIR__ . '/../../..' . '/lib/public/Migration/IRepairStep.php', 'OCP\\Migration\\SimpleMigrationStep' => __DIR__ . '/../../..' . '/lib/public/Migration/SimpleMigrationStep.php', + 'OCP\\Notification\\AlreadyProcessedException' => __DIR__ . '/../../..' . '/lib/public/Notification/AlreadyProcessedException.php', 'OCP\\Notification\\IAction' => __DIR__ . '/../../..' . '/lib/public/Notification/IAction.php', 'OCP\\Notification\\IApp' => __DIR__ . '/../../..' . '/lib/public/Notification/IApp.php', 'OCP\\Notification\\IManager' => __DIR__ . '/../../..' . '/lib/public/Notification/IManager.php', diff --git a/lib/private/Authentication/Listeners/RemoteWipeNotificationsListener.php b/lib/private/Authentication/Listeners/RemoteWipeNotificationsListener.php index ffddddff1d8..57213a8a191 100644 --- a/lib/private/Authentication/Listeners/RemoteWipeNotificationsListener.php +++ b/lib/private/Authentication/Listeners/RemoteWipeNotificationsListener.php @@ -61,7 +61,7 @@ class RemoteWipeNotificationsListener implements IEventListener { $notification->setApp('auth') ->setUser($token->getUID()) ->setDateTime($this->timeFactory->getDateTime()) - ->setObject('token', $token->getId()) + ->setObject('token', (string) $token->getId()) ->setSubject($event, [ 'name' => $token->getName(), ]); diff --git a/lib/private/Authentication/Notifications/Notifier.php b/lib/private/Authentication/Notifications/Notifier.php index 0aafc115b22..f76bb077a3c 100644 --- a/lib/private/Authentication/Notifications/Notifier.php +++ b/lib/private/Authentication/Notifications/Notifier.php @@ -42,7 +42,7 @@ class Notifier implements INotifier { /** * @inheritDoc */ - public function prepare(INotification $notification, $languageCode) { + public function prepare(INotification $notification, string $languageCode): INotification { if ($notification->getApp() !== 'auth') { // Not my app => throw throw new InvalidArgumentException(); @@ -74,4 +74,23 @@ class Notifier implements INotifier { } } + /** + * Identifier of the notifier, only use [a-z0-9_] + * + * @return string + * @since 17.0.0 + */ + public function getID(): string { + return 'auth'; + } + + /** + * Human readable name describing the notifier + * + * @return string + * @since 17.0.0 + */ + public function getName(): string { + return $this->factory->get('lib')->t('Authentication'); + } } diff --git a/lib/private/Notification/Action.php b/lib/private/Notification/Action.php index 8dfeecb98cb..f6d6a333583 100644 --- a/lib/private/Notification/Action.php +++ b/lib/private/Notification/Action.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); /** * @copyright Copyright (c) 2016, ownCloud, Inc. * @@ -45,9 +46,6 @@ class Action implements IAction { /** @var bool */ protected $primary; - /** - * Constructor - */ public function __construct() { $this->label = ''; $this->labelParsed = ''; @@ -62,8 +60,8 @@ class Action implements IAction { * @throws \InvalidArgumentException if the label is invalid * @since 8.2.0 */ - public function setLabel($label) { - if (!is_string($label) || $label === '' || isset($label[32])) { + public function setLabel(string $label): IAction { + if ($label === '' || isset($label[32])) { throw new \InvalidArgumentException('The given label is invalid'); } $this->label = $label; @@ -74,7 +72,7 @@ class Action implements IAction { * @return string * @since 8.2.0 */ - public function getLabel() { + public function getLabel(): string { return $this->label; } @@ -84,8 +82,8 @@ class Action implements IAction { * @throws \InvalidArgumentException if the label is invalid * @since 8.2.0 */ - public function setParsedLabel($label) { - if (!is_string($label) || $label === '') { + public function setParsedLabel(string $label): IAction { + if ($label === '') { throw new \InvalidArgumentException('The given parsed label is invalid'); } $this->labelParsed = $label; @@ -96,21 +94,16 @@ class Action implements IAction { * @return string * @since 8.2.0 */ - public function getParsedLabel() { + public function getParsedLabel(): string { return $this->labelParsed; } /** * @param $primary bool * @return $this - * @throws \InvalidArgumentException if $primary is invalid * @since 9.0.0 */ - public function setPrimary($primary) { - if (!is_bool($primary)) { - throw new \InvalidArgumentException('The given primary option is invalid'); - } - + public function setPrimary(bool $primary): IAction { $this->primary = $primary; return $this; } @@ -119,7 +112,7 @@ class Action implements IAction { * @return bool * @since 9.0.0 */ - public function isPrimary() { + public function isPrimary(): bool { return $this->primary; } @@ -130,11 +123,17 @@ class Action implements IAction { * @throws \InvalidArgumentException if the link is invalid * @since 8.2.0 */ - public function setLink($link, $requestType) { - if (!is_string($link) || $link === '' || isset($link[256])) { + public function setLink(string $link, string $requestType): IAction { + if ($link === '' || isset($link[256])) { throw new \InvalidArgumentException('The given link is invalid'); } - if (!in_array($requestType, ['GET', 'POST', 'PUT', 'DELETE'], true)) { + if (!in_array($requestType, [ + self::TYPE_GET, + self::TYPE_POST, + self::TYPE_PUT, + self::TYPE_DELETE, + self::TYPE_WEB, + ], true)) { throw new \InvalidArgumentException('The given request type is invalid'); } $this->link = $link; @@ -146,7 +145,7 @@ class Action implements IAction { * @return string * @since 8.2.0 */ - public function getLink() { + public function getLink(): string { return $this->link; } @@ -154,21 +153,21 @@ class Action implements IAction { * @return string * @since 8.2.0 */ - public function getRequestType() { + public function getRequestType(): string { return $this->requestType; } /** * @return bool */ - public function isValid() { + public function isValid(): bool { return $this->label !== '' && $this->link !== ''; } /** * @return bool */ - public function isValidParsed() { + public function isValidParsed(): bool { return $this->labelParsed !== '' && $this->link !== ''; } } diff --git a/lib/private/Notification/Manager.php b/lib/private/Notification/Manager.php index 4c3f7a2453c..fae0a66491e 100644 --- a/lib/private/Notification/Manager.php +++ b/lib/private/Notification/Manager.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); /** * @copyright Copyright (c) 2016, ownCloud, Inc. * @@ -25,6 +26,9 @@ namespace OC\Notification; +use OCP\AppFramework\QueryException; +use OCP\ILogger; +use OCP\Notification\AlreadyProcessedException; use OCP\Notification\IApp; use OCP\Notification\IManager; use OCP\Notification\INotification; @@ -34,52 +38,39 @@ use OCP\RichObjectStrings\IValidator; class Manager implements IManager { /** @var IValidator */ protected $validator; + /** @var ILogger */ + protected $logger; /** @var IApp[] */ protected $apps; + /** @var string[] */ + protected $appClasses; /** @var INotifier[] */ protected $notifiers; - - /** @var array[] */ - protected $notifiersInfo; - - /** @var \Closure[] */ - protected $appsClosures; - - /** @var \Closure[] */ - protected $notifiersClosures; - - /** @var \Closure[] */ - protected $notifiersInfoClosures; + /** @var string[] */ + protected $notifierClasses; /** @var bool */ protected $preparingPushNotification; - /** - * Manager constructor. - * - * @param IValidator $validator - */ - public function __construct(IValidator $validator) { + public function __construct(IValidator $validator, + ILogger $logger) { $this->validator = $validator; + $this->logger = $logger; $this->apps = []; $this->notifiers = []; - $this->notifiersInfo = []; - $this->appsClosures = []; - $this->notifiersClosures = []; - $this->notifiersInfoClosures = []; + $this->appClasses = []; + $this->notifierClasses = []; $this->preparingPushNotification = false; } - /** - * @param \Closure $service The service must implement IApp, otherwise a + * @param string $appClass The service must implement IApp, otherwise a * \InvalidArgumentException is thrown later - * @since 8.2.0 + * @since 17.0.0 */ - public function registerApp(\Closure $service) { - $this->appsClosures[] = $service; - $this->apps = []; + public function registerApp(string $appClass): void { + $this->appClasses[] = $appClass; } /** @@ -87,76 +78,91 @@ class Manager implements IManager { * \InvalidArgumentException is thrown later * @param \Closure $info An array with the keys 'id' and 'name' containing * the app id and the app name + * @deprecated 17.0.0 use registerNotifierService instead. * @since 8.2.0 - Parameter $info was added in 9.0.0 */ public function registerNotifier(\Closure $service, \Closure $info) { - $this->notifiersClosures[] = $service; - $this->notifiersInfoClosures[] = $info; - $this->notifiers = []; - $this->notifiersInfo = []; + $infoData = $info(); + $this->logger->logException(new \InvalidArgumentException( + 'Notifier ' . $infoData['name'] . ' (id: ' . $infoData['id'] . ') is not considered because it is using the old way to register.' + )); + } + + /** + * @param string $notifierService The service must implement INotifier, otherwise a + * \InvalidArgumentException is thrown later + * @since 17.0.0 + */ + public function registerNotifierService(string $notifierService): void { + $this->notifierClasses[] = $notifierService; } /** * @return IApp[] */ protected function getApps(): array { - if (!empty($this->apps)) { + if (empty($this->appClasses)) { return $this->apps; } - $this->apps = []; - foreach ($this->appsClosures as $closure) { - $app = $closure(); + foreach ($this->appClasses as $appClass) { + try { + $app = \OC::$server->query($appClass); + } catch (QueryException $e) { + $this->logger->logException($e, [ + 'message' => 'Failed to load notification app class: ' . $appClass, + 'app' => 'notifications', + ]); + continue; + } + if (!($app instanceof IApp)) { - throw new \InvalidArgumentException('The given notification app does not implement the IApp interface'); + $this->logger->error('Notification app class ' . $appClass . ' is not implementing ' . IApp::class, [ + 'app' => 'notifications', + ]); + continue; } + $this->apps[] = $app; } + $this->appClasses = []; + return $this->apps; } /** * @return INotifier[] */ - protected function getNotifiers(): array { - if (!empty($this->notifiers)) { + public function getNotifiers(): array { + if (empty($this->notifierClasses)) { return $this->notifiers; } - $this->notifiers = []; - foreach ($this->notifiersClosures as $closure) { - $notifier = $closure(); - if (!($notifier instanceof INotifier)) { - throw new \InvalidArgumentException('The given notifier does not implement the INotifier interface'); + foreach ($this->notifierClasses as $notifierClass) { + try { + $notifier = \OC::$server->query($notifierClass); + } catch (QueryException $e) { + $this->logger->logException($e, [ + 'message' => 'Failed to load notification notifier class: ' . $notifierClass, + 'app' => 'notifications', + ]); + continue; } - $this->notifiers[] = $notifier; - } - return $this->notifiers; - } + if (!($notifier instanceof INotifier)) { + $this->logger->error('Notification notifier class ' . $notifierClass . ' is not implementing ' . INotifier::class, [ + 'app' => 'notifications', + ]); + continue; + } - /** - * @return array[] - */ - public function listNotifiers(): array { - if (!empty($this->notifiersInfo)) { - return $this->notifiersInfo; + $this->notifiers[] = $notifier; } - $this->notifiersInfo = []; - foreach ($this->notifiersInfoClosures as $closure) { - $notifier = $closure(); - if (!\is_array($notifier) || \count($notifier) !== 2 || !isset($notifier['id'], $notifier['name'])) { - throw new \InvalidArgumentException('The given notifier information is invalid'); - } - if (isset($this->notifiersInfo[$notifier['id']])) { - throw new \InvalidArgumentException('The given notifier ID ' . $notifier['id'] . ' is already in use'); - } - $this->notifiersInfo[$notifier['id']] = $notifier['name']; - } + $this->notifierClasses = []; - return $this->notifiersInfo; + return $this->notifiers; } /** @@ -172,14 +178,14 @@ class Manager implements IManager { * @since 8.2.0 */ public function hasNotifiers(): bool { - return !empty($this->notifiersClosures); + return !empty($this->notifiers) || !empty($this->notifierClasses); } /** * @param bool $preparingPushNotification * @since 14.0.0 */ - public function setPreparingPushNotification($preparingPushNotification) { + public function setPreparingPushNotification(bool $preparingPushNotification): void { $this->preparingPushNotification = $preparingPushNotification; } @@ -196,7 +202,7 @@ class Manager implements IManager { * @throws \InvalidArgumentException When the notification is not valid * @since 8.2.0 */ - public function notify(INotification $notification) { + public function notify(INotification $notification): void { if (!$notification->isValid()) { throw new \InvalidArgumentException('The given notification is invalid'); } @@ -212,13 +218,34 @@ class Manager implements IManager { } /** + * Identifier of the notifier, only use [a-z0-9_] + * + * @return string + * @since 17.0.0 + */ + public function getID(): string { + return 'core'; + } + + /** + * Human readable name describing the notifier + * + * @return string + * @since 17.0.0 + */ + public function getName(): string { + return 'core'; + } + + /** * @param INotification $notification * @param string $languageCode The code of the language that should be used to prepare the notification * @return INotification * @throws \InvalidArgumentException When the notification was not prepared by a notifier + * @throws AlreadyProcessedException When the notification is not needed anymore and should be deleted * @since 8.2.0 */ - public function prepare(INotification $notification, $languageCode): INotification { + public function prepare(INotification $notification, string $languageCode): INotification { $notifiers = $this->getNotifiers(); foreach ($notifiers as $notifier) { @@ -226,6 +253,9 @@ class Manager implements IManager { $notification = $notifier->prepare($notification, $languageCode); } catch (\InvalidArgumentException $e) { continue; + } catch (AlreadyProcessedException $e) { + $this->markProcessed($notification); + throw new \InvalidArgumentException('The given notification has been processed'); } if (!($notification instanceof INotification) || !$notification->isValidParsed()) { @@ -243,7 +273,7 @@ class Manager implements IManager { /** * @param INotification $notification */ - public function markProcessed(INotification $notification) { + public function markProcessed(INotification $notification): void { $apps = $this->getApps(); foreach ($apps as $app) { diff --git a/lib/private/Notification/Notification.php b/lib/private/Notification/Notification.php index 47f415d15d3..e64c059db2a 100644 --- a/lib/private/Notification/Notification.php +++ b/lib/private/Notification/Notification.php @@ -1,5 +1,5 @@ <?php -declare (strict_types = 1); +declare(strict_types=1); /** * @copyright Copyright (c) 2016, ownCloud, Inc. * @@ -99,11 +99,6 @@ class Notification implements INotification { /** @var bool */ protected $hasPrimaryParsedAction; - /** - * Constructor - * - * @param IValidator $richValidator - */ public function __construct(IValidator $richValidator) { $this->richValidator = $richValidator; $this->app = ''; @@ -134,8 +129,8 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the app id is invalid * @since 8.2.0 */ - public function setApp(string $app) { - if (trim($app) === '' || isset($app[32])) { + public function setApp(string $app): INotification { + if ($app === '' || isset($app[32])) { throw new \InvalidArgumentException('The given app name is invalid'); } $this->app = $app; @@ -146,7 +141,7 @@ class Notification implements INotification { * @return string * @since 8.2.0 */ - public function getApp() { + public function getApp(): string { return $this->app; } @@ -156,8 +151,8 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the user id is invalid * @since 8.2.0 */ - public function setUser(string $user) { - if (trim($user) === '' || isset($user[64])) { + public function setUser(string $user): INotification { + if ($user === '' || isset($user[64])) { throw new \InvalidArgumentException('The given user id is invalid'); } $this->user = $user; @@ -168,7 +163,7 @@ class Notification implements INotification { * @return string * @since 8.2.0 */ - public function getUser() { + public function getUser(): string { return $this->user; } @@ -178,7 +173,7 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the $dateTime is invalid * @since 9.0.0 */ - public function setDateTime(\DateTime $dateTime) { + public function setDateTime(\DateTime $dateTime): INotification { if ($dateTime->getTimestamp() === 0) { throw new \InvalidArgumentException('The given date time is invalid'); } @@ -190,7 +185,7 @@ class Notification implements INotification { * @return \DateTime * @since 9.0.0 */ - public function getDateTime() { + public function getDateTime(): \DateTime { return $this->dateTime; } @@ -201,13 +196,13 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the object type or id is invalid * @since 8.2.0 - 9.0.0: Type of $id changed to string */ - public function setObject(string $type, $id) { - if (trim($type) === '' || isset($type[64])) { + public function setObject(string $type, string $id): INotification { + if ($type === '' || isset($type[64])) { throw new \InvalidArgumentException('The given object type is invalid'); } $this->objectType = $type; - if (!is_int($id) && (!is_string($id) || $id === '' || isset($id[64]))) { + if ($id === '' || isset($id[64])) { throw new \InvalidArgumentException('The given object id is invalid'); } $this->objectId = (string) $id; @@ -218,7 +213,7 @@ class Notification implements INotification { * @return string * @since 8.2.0 */ - public function getObjectType() { + public function getObjectType(): string { return $this->objectType; } @@ -226,7 +221,7 @@ class Notification implements INotification { * @return string * @since 8.2.0 - 9.0.0: Return type changed to string */ - public function getObjectId() { + public function getObjectId(): string { return $this->objectId; } @@ -237,8 +232,8 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the subject or parameters are invalid * @since 8.2.0 */ - public function setSubject(string $subject, array $parameters = []) { - if (trim($subject) === '' || isset($subject[64])) { + public function setSubject(string $subject, array $parameters = []): INotification { + if ($subject === '' || isset($subject[64])) { throw new \InvalidArgumentException('The given subject is invalid'); } @@ -252,15 +247,15 @@ class Notification implements INotification { * @return string * @since 8.2.0 */ - public function getSubject() { + public function getSubject(): string { return $this->subject; } /** - * @return string[] + * @return array * @since 8.2.0 */ - public function getSubjectParameters() { + public function getSubjectParameters(): array { return $this->subjectParameters; } @@ -270,8 +265,8 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the subject is invalid * @since 8.2.0 */ - public function setParsedSubject(string $subject) { - if (trim($subject) === '') { + public function setParsedSubject(string $subject): INotification { + if ($subject === '') { throw new \InvalidArgumentException('The given parsed subject is invalid'); } $this->subjectParsed = $subject; @@ -282,7 +277,7 @@ class Notification implements INotification { * @return string * @since 8.2.0 */ - public function getParsedSubject() { + public function getParsedSubject(): string { return $this->subjectParsed; } @@ -293,8 +288,8 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the subject or parameters are invalid * @since 11.0.0 */ - public function setRichSubject(string $subject, array $parameters = []) { - if (trim($subject) === '') { + public function setRichSubject(string $subject, array $parameters = []): INotification { + if ($subject === '') { throw new \InvalidArgumentException('The given parsed subject is invalid'); } @@ -308,7 +303,7 @@ class Notification implements INotification { * @return string * @since 11.0.0 */ - public function getRichSubject() { + public function getRichSubject(): string { return $this->subjectRich; } @@ -316,7 +311,7 @@ class Notification implements INotification { * @return array[] * @since 11.0.0 */ - public function getRichSubjectParameters() { + public function getRichSubjectParameters(): array { return $this->subjectRichParameters; } @@ -327,8 +322,8 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the message or parameters are invalid * @since 8.2.0 */ - public function setMessage(string $message, array $parameters = []) { - if (trim($message) === '' || isset($message[64])) { + public function setMessage(string $message, array $parameters = []): INotification { + if ($message === '' || isset($message[64])) { throw new \InvalidArgumentException('The given message is invalid'); } @@ -342,15 +337,15 @@ class Notification implements INotification { * @return string * @since 8.2.0 */ - public function getMessage() { + public function getMessage(): string { return $this->message; } /** - * @return string[] + * @return array * @since 8.2.0 */ - public function getMessageParameters() { + public function getMessageParameters(): array { return $this->messageParameters; } @@ -360,8 +355,8 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the message is invalid * @since 8.2.0 */ - public function setParsedMessage(string $message) { - if (trim($message) === '') { + public function setParsedMessage(string $message): INotification { + if ($message === '') { throw new \InvalidArgumentException('The given parsed message is invalid'); } $this->messageParsed = $message; @@ -372,7 +367,7 @@ class Notification implements INotification { * @return string * @since 8.2.0 */ - public function getParsedMessage() { + public function getParsedMessage(): string { return $this->messageParsed; } @@ -383,8 +378,8 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the message or parameters are invalid * @since 11.0.0 */ - public function setRichMessage(string $message, array $parameters = []) { - if (trim($message) === '') { + public function setRichMessage(string $message, array $parameters = []): INotification { + if ($message === '') { throw new \InvalidArgumentException('The given parsed message is invalid'); } @@ -398,7 +393,7 @@ class Notification implements INotification { * @return string * @since 11.0.0 */ - public function getRichMessage() { + public function getRichMessage(): string { return $this->messageRich; } @@ -406,7 +401,7 @@ class Notification implements INotification { * @return array[] * @since 11.0.0 */ - public function getRichMessageParameters() { + public function getRichMessageParameters(): array { return $this->messageRichParameters; } @@ -416,8 +411,8 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the link is invalid * @since 8.2.0 */ - public function setLink(string $link) { - if (trim($link) === '' || isset($link[4000])) { + public function setLink(string $link): INotification { + if ($link === '' || isset($link[4000])) { throw new \InvalidArgumentException('The given link is invalid'); } $this->link = $link; @@ -428,7 +423,7 @@ class Notification implements INotification { * @return string * @since 8.2.0 */ - public function getLink() { + public function getLink(): string { return $this->link; } @@ -438,8 +433,8 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the icon is invalid * @since 11.0.0 */ - public function setIcon(string $icon) { - if (trim($icon) === '' || isset($icon[4000])) { + public function setIcon(string $icon): INotification { + if ($icon === '' || isset($icon[4000])) { throw new \InvalidArgumentException('The given icon is invalid'); } $this->icon = $icon; @@ -450,7 +445,7 @@ class Notification implements INotification { * @return string * @since 11.0.0 */ - public function getIcon() { + public function getIcon(): string { return $this->icon; } @@ -458,7 +453,7 @@ class Notification implements INotification { * @return IAction * @since 8.2.0 */ - public function createAction() { + public function createAction(): IAction { return new Action(); } @@ -468,7 +463,7 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the action is invalid * @since 8.2.0 */ - public function addAction(IAction $action) { + public function addAction(IAction $action): INotification { if (!$action->isValid()) { throw new \InvalidArgumentException('The given action is invalid'); } @@ -489,7 +484,7 @@ class Notification implements INotification { * @return IAction[] * @since 8.2.0 */ - public function getActions() { + public function getActions(): array { return $this->actions; } @@ -499,7 +494,7 @@ class Notification implements INotification { * @throws \InvalidArgumentException if the action is invalid * @since 8.2.0 */ - public function addParsedAction(IAction $action) { + public function addParsedAction(IAction $action): INotification { if (!$action->isValidParsed()) { throw new \InvalidArgumentException('The given parsed action is invalid'); } @@ -524,7 +519,7 @@ class Notification implements INotification { * @return IAction[] * @since 8.2.0 */ - public function getParsedActions() { + public function getParsedActions(): array { return $this->actionsParsed; } @@ -532,7 +527,7 @@ class Notification implements INotification { * @return bool * @since 8.2.0 */ - public function isValid() { + public function isValid(): bool { return $this->isValidCommon() && @@ -544,7 +539,7 @@ class Notification implements INotification { * @return bool * @since 8.2.0 */ - public function isValidParsed() { + public function isValidParsed(): bool { if ($this->getRichSubject() !== '' || !empty($this->getRichSubjectParameters())) { try { $this->richValidator->validate($this->getRichSubject(), $this->getRichSubjectParameters()); @@ -568,10 +563,7 @@ class Notification implements INotification { ; } - /** - * @return bool - */ - protected function isValidCommon() { + protected function isValidCommon(): bool { return $this->getApp() !== '' && diff --git a/lib/private/Server.php b/lib/private/Server.php index ccdb31c3e82..64180f1cd7c 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -900,7 +900,8 @@ class Server extends ServerContainer implements IServerContainer { }); $this->registerService(\OCP\Notification\IManager::class, function (Server $c) { return new Manager( - $c->query(IValidator::class) + $c->query(IValidator::class), + $c->getLogger() ); }); $this->registerAlias('NotificationManager', \OCP\Notification\IManager::class); diff --git a/lib/public/Notification/AlreadyProcessedException.php b/lib/public/Notification/AlreadyProcessedException.php new file mode 100644 index 00000000000..0ccac25f0fb --- /dev/null +++ b/lib/public/Notification/AlreadyProcessedException.php @@ -0,0 +1,38 @@ +<?php +declare(strict_types=1); +/** + * @copyright Copyright (c) 2019 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\Notification; + + +/** + * @since 17.0.0 + */ +class AlreadyProcessedException extends \RuntimeException { + + /** + * @since 17.0.0 + */ + public function __construct() { + parent::__construct('Notification is processed already'); + } + +} diff --git a/lib/public/Notification/IAction.php b/lib/public/Notification/IAction.php index 6f2b78e3a8d..718a61b2f39 100644 --- a/lib/public/Notification/IAction.php +++ b/lib/public/Notification/IAction.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); /** * @copyright Copyright (c) 2016, ownCloud, Inc. * @@ -29,19 +30,41 @@ namespace OCP\Notification; * @since 9.0.0 */ interface IAction { + + /** + * @since 17.0.0 + */ + public const TYPE_GET = 'GET'; + /** + * @since 17.0.0 + */ + public const TYPE_POST = 'POST'; + /** + * @since 17.0.0 + */ + public const TYPE_PUT = 'PUT'; + /** + * @since 17.0.0 + */ + public const TYPE_DELETE = 'DELETE'; + /** + * @since 17.0.0 + */ + public const TYPE_WEB = 'WEB'; + /** * @param string $label * @return $this * @throws \InvalidArgumentException if the label is invalid * @since 9.0.0 */ - public function setLabel($label); + public function setLabel(string $label): IAction; /** * @return string * @since 9.0.0 */ - public function getLabel(); + public function getLabel(): string; /** * @param string $label @@ -49,27 +72,27 @@ interface IAction { * @throws \InvalidArgumentException if the label is invalid * @since 9.0.0 */ - public function setParsedLabel($label); + public function setParsedLabel(string $label): IAction; /** * @return string * @since 9.0.0 */ - public function getParsedLabel(); + public function getParsedLabel(): string; /** - * @param $primary bool + * @param bool $primary * @return $this * @throws \InvalidArgumentException if $primary is invalid * @since 9.0.0 */ - public function setPrimary($primary); + public function setPrimary(bool $primary): IAction; /** * @return bool * @since 9.0.0 */ - public function isPrimary(); + public function isPrimary(): bool; /** * @param string $link @@ -78,29 +101,29 @@ interface IAction { * @throws \InvalidArgumentException if the link is invalid * @since 9.0.0 */ - public function setLink($link, $requestType); + public function setLink(string $link, string $requestType): IAction; /** * @return string * @since 9.0.0 */ - public function getLink(); + public function getLink(): string; /** * @return string * @since 9.0.0 */ - public function getRequestType(); + public function getRequestType(): string; /** * @return bool * @since 9.0.0 */ - public function isValid(); + public function isValid(): bool; /** * @return bool * @since 9.0.0 */ - public function isValidParsed(); + public function isValidParsed(): bool; } diff --git a/lib/public/Notification/IApp.php b/lib/public/Notification/IApp.php index 8f7b9b3d013..58d2a1fa5b8 100644 --- a/lib/public/Notification/IApp.php +++ b/lib/public/Notification/IApp.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); /** * @copyright Copyright (c) 2016, ownCloud, Inc. * @@ -34,18 +35,18 @@ interface IApp { * @throws \InvalidArgumentException When the notification is not valid * @since 9.0.0 */ - public function notify(INotification $notification); + public function notify(INotification $notification): void; /** * @param INotification $notification * @since 9.0.0 */ - public function markProcessed(INotification $notification); + public function markProcessed(INotification $notification): void; /** * @param INotification $notification * @return int * @since 9.0.0 */ - public function getCount(INotification $notification); + public function getCount(INotification $notification): int; } diff --git a/lib/public/Notification/IManager.php b/lib/public/Notification/IManager.php index 003e5f1bad1..af890594d4c 100644 --- a/lib/public/Notification/IManager.php +++ b/lib/public/Notification/IManager.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); /** * @copyright Copyright (c) 2016, ownCloud, Inc. * @@ -30,48 +31,56 @@ namespace OCP\Notification; */ interface IManager extends IApp, INotifier { /** - * @param \Closure $service The service must implement IApp, otherwise a + * @param string $appClass The service must implement IApp, otherwise a * \InvalidArgumentException is thrown later - * @since 9.0.0 + * @since 17.0.0 */ - public function registerApp(\Closure $service); + public function registerApp(string $appClass): void; /** * @param \Closure $service The service must implement INotifier, otherwise a * \InvalidArgumentException is thrown later * @param \Closure $info An array with the keys 'id' and 'name' containing * the app id and the app name - * @since 9.0.0 + * @deprecated 17.0.0 use registerNotifierService instead. + * @since 8.2.0 - Parameter $info was added in 9.0.0 */ public function registerNotifier(\Closure $service, \Closure $info); /** - * @return array App ID => App Name + * @param string $notifierService The service must implement INotifier, otherwise a + * \InvalidArgumentException is thrown later + * @since 17.0.0 + */ + public function registerNotifierService(string $notifierService): void; + + /** + * @return INotifier[] * @since 9.0.0 */ - public function listNotifiers(); + public function getNotifiers(): array; /** * @return INotification * @since 9.0.0 */ - public function createNotification(); + public function createNotification(): INotification; /** * @return bool * @since 9.0.0 */ - public function hasNotifiers(); + public function hasNotifiers(): bool; /** * @param bool $preparingPushNotification * @since 14.0.0 */ - public function setPreparingPushNotification($preparingPushNotification); + public function setPreparingPushNotification(bool $preparingPushNotification): void; /** * @return bool * @since 14.0.0 */ - public function isPreparingPushNotification(); + public function isPreparingPushNotification(): bool; } diff --git a/lib/public/Notification/INotification.php b/lib/public/Notification/INotification.php index f7400e4778b..7261409e355 100644 --- a/lib/public/Notification/INotification.php +++ b/lib/public/Notification/INotification.php @@ -1,5 +1,5 @@ <?php -declare (strict_types = 1); +declare(strict_types=1); /** * @copyright Copyright (c) 2016, ownCloud, Inc. * @@ -37,13 +37,13 @@ interface INotification { * @throws \InvalidArgumentException if the app id is invalid * @since 9.0.0 */ - public function setApp(string $app); + public function setApp(string $app): INotification; /** * @return string * @since 9.0.0 */ - public function getApp(); + public function getApp(): string; /** * @param string $user @@ -51,13 +51,13 @@ interface INotification { * @throws \InvalidArgumentException if the user id is invalid * @since 9.0.0 */ - public function setUser(string $user); + public function setUser(string $user): INotification; /** * @return string * @since 9.0.0 */ - public function getUser(); + public function getUser(): string; /** * @param \DateTime $dateTime @@ -65,13 +65,13 @@ interface INotification { * @throws \InvalidArgumentException if the $dateTime is invalid * @since 9.0.0 */ - public function setDateTime(\DateTime $dateTime); + public function setDateTime(\DateTime $dateTime): INotification; /** * @return \DateTime * @since 9.0.0 */ - public function getDateTime(); + public function getDateTime(): \DateTime; /** * @param string $type @@ -80,19 +80,19 @@ interface INotification { * @throws \InvalidArgumentException if the object type or id is invalid * @since 9.0.0 */ - public function setObject(string $type, $id); + public function setObject(string $type, string $id): INotification; /** * @return string * @since 9.0.0 */ - public function getObjectType(); + public function getObjectType(): string; /** * @return string * @since 9.0.0 */ - public function getObjectId(); + public function getObjectId(): string; /** * @param string $subject @@ -101,19 +101,19 @@ interface INotification { * @throws \InvalidArgumentException if the subject or parameters are invalid * @since 9.0.0 */ - public function setSubject(string $subject, array $parameters = []); + public function setSubject(string $subject, array $parameters = []): INotification; /** * @return string * @since 9.0.0 */ - public function getSubject(); + public function getSubject(): string; /** - * @return string[] + * @return array * @since 9.0.0 */ - public function getSubjectParameters(); + public function getSubjectParameters(): array; /** * Set a parsed subject @@ -132,13 +132,13 @@ interface INotification { * @throws \InvalidArgumentException if the subject is invalid * @since 9.0.0 */ - public function setParsedSubject(string $subject); + public function setParsedSubject(string $subject): INotification; /** * @return string * @since 9.0.0 */ - public function getParsedSubject(); + public function getParsedSubject(): string; /** * Set a RichObjectString subject @@ -157,19 +157,19 @@ interface INotification { * @throws \InvalidArgumentException if the subject or parameters are invalid * @since 11.0.0 */ - public function setRichSubject(string $subject, array $parameters = []); + public function setRichSubject(string $subject, array $parameters = []): INotification; /** * @return string * @since 11.0.0 */ - public function getRichSubject(); + public function getRichSubject(): string; /** * @return array[] * @since 11.0.0 */ - public function getRichSubjectParameters(); + public function getRichSubjectParameters(): array; /** * @param string $message @@ -178,19 +178,19 @@ interface INotification { * @throws \InvalidArgumentException if the message or parameters are invalid * @since 9.0.0 */ - public function setMessage(string $message, array $parameters = []); + public function setMessage(string $message, array $parameters = []): INotification; /** * @return string * @since 9.0.0 */ - public function getMessage(); + public function getMessage(): string; /** - * @return string[] + * @return array * @since 9.0.0 */ - public function getMessageParameters(); + public function getMessageParameters(): array; /** * Set a parsed message @@ -209,13 +209,13 @@ interface INotification { * @throws \InvalidArgumentException if the message is invalid * @since 9.0.0 */ - public function setParsedMessage(string $message); + public function setParsedMessage(string $message): INotification; /** * @return string * @since 9.0.0 */ - public function getParsedMessage(); + public function getParsedMessage(): string; /** * Set a RichObjectString message @@ -234,19 +234,19 @@ interface INotification { * @throws \InvalidArgumentException if the message or parameters are invalid * @since 11.0.0 */ - public function setRichMessage(string $message, array $parameters = []); + public function setRichMessage(string $message, array $parameters = []): INotification; /** * @return string * @since 11.0.0 */ - public function getRichMessage(); + public function getRichMessage(): string; /** * @return array[] * @since 11.0.0 */ - public function getRichMessageParameters(); + public function getRichMessageParameters(): array; /** * @param string $link @@ -254,13 +254,13 @@ interface INotification { * @throws \InvalidArgumentException if the link is invalid * @since 9.0.0 */ - public function setLink(string $link); + public function setLink(string $link): INotification; /** * @return string * @since 9.0.0 */ - public function getLink(); + public function getLink(): string; /** * @param string $icon @@ -268,19 +268,19 @@ interface INotification { * @throws \InvalidArgumentException if the icon is invalid * @since 11.0.0 */ - public function setIcon(string $icon); + public function setIcon(string $icon): INotification; /** * @return string * @since 11.0.0 */ - public function getIcon(); + public function getIcon(): string; /** * @return IAction * @since 9.0.0 */ - public function createAction(); + public function createAction(): IAction; /** * @param IAction $action @@ -288,13 +288,13 @@ interface INotification { * @throws \InvalidArgumentException if the action is invalid * @since 9.0.0 */ - public function addAction(IAction $action); + public function addAction(IAction $action): INotification; /** * @return IAction[] * @since 9.0.0 */ - public function getActions(); + public function getActions(): array; /** * @param IAction $action @@ -302,23 +302,23 @@ interface INotification { * @throws \InvalidArgumentException if the action is invalid * @since 9.0.0 */ - public function addParsedAction(IAction $action); + public function addParsedAction(IAction $action): INotification; /** * @return IAction[] * @since 9.0.0 */ - public function getParsedActions(); + public function getParsedActions(): array; /** * @return bool * @since 9.0.0 */ - public function isValid(); + public function isValid(): bool; /** * @return bool * @since 9.0.0 */ - public function isValidParsed(); + public function isValidParsed(): bool; } diff --git a/lib/public/Notification/INotifier.php b/lib/public/Notification/INotifier.php index 5e2a47266ad..b730b1d8015 100644 --- a/lib/public/Notification/INotifier.php +++ b/lib/public/Notification/INotifier.php @@ -1,4 +1,5 @@ <?php +declare(strict_types=1); /** * @copyright Copyright (c) 2016, ownCloud, Inc. * @@ -29,12 +30,30 @@ namespace OCP\Notification; * @since 9.0.0 */ interface INotifier { + + /** + * Identifier of the notifier, only use [a-z0-9_] + * + * @return string + * @since 17.0.0 + */ + public function getID(): string; + + /** + * Human readable name describing the notifier + * + * @return string + * @since 17.0.0 + */ + public function getName(): string; + /** * @param INotification $notification * @param string $languageCode The code of the language that should be used to prepare the notification * @return INotification * @throws \InvalidArgumentException When the notification was not prepared by a notifier + * @throws AlreadyProcessedException When the notification is not needed anymore and should be deleted * @since 9.0.0 */ - public function prepare(INotification $notification, $languageCode); + public function prepare(INotification $notification, string $languageCode): INotification; } |