aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Notification
diff options
context:
space:
mode:
authorRoeland Jago Douma <rullzer@owncloud.com>2016-04-18 09:20:06 +0200
committerRoeland Jago Douma <rullzer@owncloud.com>2016-04-18 09:20:06 +0200
commit3301bfd1956d133b4e06e2690f4520d240d54026 (patch)
tree09c5f861a69a65dd5fc04bf46e32c75f552c4639 /lib/private/Notification
parentd5dbd4e0516b19ae77b555d286022714b5c44472 (diff)
downloadnextcloud-server-3301bfd1956d133b4e06e2690f4520d240d54026.tar.gz
nextcloud-server-3301bfd1956d133b4e06e2690f4520d240d54026.zip
Move \OC\Notification to PSR-4
Diffstat (limited to 'lib/private/Notification')
-rw-r--r--lib/private/Notification/Action.php173
-rw-r--r--lib/private/Notification/Manager.php240
-rw-r--r--lib/private/Notification/Notification.php453
3 files changed, 866 insertions, 0 deletions
diff --git a/lib/private/Notification/Action.php b/lib/private/Notification/Action.php
new file mode 100644
index 00000000000..deac6807653
--- /dev/null
+++ b/lib/private/Notification/Action.php
@@ -0,0 +1,173 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Notification;
+
+
+use OCP\Notification\IAction;
+
+class Action implements IAction {
+
+ /** @var string */
+ protected $label;
+
+ /** @var string */
+ protected $labelParsed;
+
+ /** @var string */
+ protected $link;
+
+ /** @var string */
+ protected $requestType;
+
+ /** @var string */
+ protected $icon;
+
+ /** @var bool */
+ protected $primary;
+
+ /**
+ * Constructor
+ */
+ public function __construct() {
+ $this->label = '';
+ $this->labelParsed = '';
+ $this->link = '';
+ $this->requestType = '';
+ $this->primary = false;
+ }
+
+ /**
+ * @param string $label
+ * @return $this
+ * @throws \InvalidArgumentException if the label is invalid
+ * @since 8.2.0
+ */
+ public function setLabel($label) {
+ if (!is_string($label) || $label === '' || isset($label[32])) {
+ throw new \InvalidArgumentException('The given label is invalid');
+ }
+ $this->label = $label;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getLabel() {
+ return $this->label;
+ }
+
+ /**
+ * @param string $label
+ * @return $this
+ * @throws \InvalidArgumentException if the label is invalid
+ * @since 8.2.0
+ */
+ public function setParsedLabel($label) {
+ if (!is_string($label) || $label === '') {
+ throw new \InvalidArgumentException('The given parsed label is invalid');
+ }
+ $this->labelParsed = $label;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getParsedLabel() {
+ 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');
+ }
+
+ $this->primary = $primary;
+ return $this;
+ }
+
+ /**
+ * @return bool
+ * @since 9.0.0
+ */
+ public function isPrimary() {
+ return $this->primary;
+ }
+
+ /**
+ * @param string $link
+ * @param string $requestType
+ * @return $this
+ * @throws \InvalidArgumentException if the link is invalid
+ * @since 8.2.0
+ */
+ public function setLink($link, $requestType) {
+ if (!is_string($link) || $link === '' || isset($link[256])) {
+ throw new \InvalidArgumentException('The given link is invalid');
+ }
+ if (!in_array($requestType, ['GET', 'POST', 'PUT', 'DELETE'], true)) {
+ throw new \InvalidArgumentException('The given request type is invalid');
+ }
+ $this->link = $link;
+ $this->requestType = $requestType;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getLink() {
+ return $this->link;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getRequestType() {
+ return $this->requestType;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isValid() {
+ return $this->label !== '' && $this->link !== '';
+ }
+
+ /**
+ * @return bool
+ */
+ public function isValidParsed() {
+ return $this->labelParsed !== '' && $this->link !== '';
+ }
+}
diff --git a/lib/private/Notification/Manager.php b/lib/private/Notification/Manager.php
new file mode 100644
index 00000000000..3ddc9b21161
--- /dev/null
+++ b/lib/private/Notification/Manager.php
@@ -0,0 +1,240 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ * @author Morris Jobke <hey@morrisjobke.de>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Notification;
+
+
+use OCP\Notification\IApp;
+use OCP\Notification\IManager;
+use OCP\Notification\INotification;
+use OCP\Notification\INotifier;
+
+class Manager implements IManager {
+ /** @var IApp[] */
+ protected $apps;
+
+ /** @var INotifier */
+ protected $notifiers;
+
+ /** @var array[] */
+ protected $notifiersInfo;
+
+ /** @var \Closure[] */
+ protected $appsClosures;
+
+ /** @var \Closure[] */
+ protected $notifiersClosures;
+
+ /** @var \Closure[] */
+ protected $notifiersInfoClosures;
+
+ public function __construct() {
+ $this->apps = [];
+ $this->notifiers = [];
+ $this->notifiersInfo = [];
+ $this->appsClosures = [];
+ $this->notifiersClosures = [];
+ $this->notifiersInfoClosures = [];
+ }
+
+ /**
+ * @param \Closure $service The service must implement IApp, otherwise a
+ * \InvalidArgumentException is thrown later
+ * @return null
+ * @since 8.2.0
+ */
+ public function registerApp(\Closure $service) {
+ $this->appsClosures[] = $service;
+ $this->apps = [];
+ }
+
+ /**
+ * @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
+ * @return null
+ * @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 = [];
+ }
+
+ /**
+ * @return IApp[]
+ */
+ protected function getApps() {
+ if (!empty($this->apps)) {
+ return $this->apps;
+ }
+
+ $this->apps = [];
+ foreach ($this->appsClosures as $closure) {
+ $app = $closure();
+ if (!($app instanceof IApp)) {
+ throw new \InvalidArgumentException('The given notification app does not implement the IApp interface');
+ }
+ $this->apps[] = $app;
+ }
+
+ return $this->apps;
+ }
+
+ /**
+ * @return INotifier[]
+ */
+ protected function getNotifiers() {
+ if (!empty($this->notifiers)) {
+ 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');
+ }
+ $this->notifiers[] = $notifier;
+ }
+
+ return $this->notifiers;
+ }
+
+ /**
+ * @return array[]
+ */
+ public function listNotifiers() {
+ if (!empty($this->notifiersInfo)) {
+ return $this->notifiersInfo;
+ }
+
+ $this->notifiersInfo = [];
+ foreach ($this->notifiersInfoClosures as $closure) {
+ $notifier = $closure();
+ if (!is_array($notifier) || sizeof($notifier) !== 2 || !isset($notifier['id']) || !isset($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'];
+ }
+
+ return $this->notifiersInfo;
+ }
+
+ /**
+ * @return INotification
+ * @since 8.2.0
+ */
+ public function createNotification() {
+ return new Notification();
+ }
+
+ /**
+ * @return bool
+ * @since 8.2.0
+ */
+ public function hasNotifiers() {
+ return !empty($this->notifiersClosures);
+ }
+
+ /**
+ * @param INotification $notification
+ * @return null
+ * @throws \InvalidArgumentException When the notification is not valid
+ * @since 8.2.0
+ */
+ public function notify(INotification $notification) {
+ if (!$notification->isValid()) {
+ throw new \InvalidArgumentException('The given notification is invalid');
+ }
+
+ $apps = $this->getApps();
+
+ foreach ($apps as $app) {
+ try {
+ $app->notify($notification);
+ } catch (\InvalidArgumentException $e) {
+ }
+ }
+ }
+
+ /**
+ * @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
+ * @since 8.2.0
+ */
+ public function prepare(INotification $notification, $languageCode) {
+ $notifiers = $this->getNotifiers();
+
+ foreach ($notifiers as $notifier) {
+ try {
+ $notification = $notifier->prepare($notification, $languageCode);
+ } catch (\InvalidArgumentException $e) {
+ continue;
+ }
+
+ if (!($notification instanceof INotification) || !$notification->isValidParsed()) {
+ throw new \InvalidArgumentException('The given notification has not been handled');
+ }
+ }
+
+ if (!($notification instanceof INotification) || !$notification->isValidParsed()) {
+ throw new \InvalidArgumentException('The given notification has not been handled');
+ }
+
+ return $notification;
+ }
+
+ /**
+ * @param INotification $notification
+ * @return null
+ */
+ public function markProcessed(INotification $notification) {
+ $apps = $this->getApps();
+
+ foreach ($apps as $app) {
+ $app->markProcessed($notification);
+ }
+ }
+
+ /**
+ * @param INotification $notification
+ * @return int
+ */
+ public function getCount(INotification $notification) {
+ $apps = $this->getApps();
+
+ $count = 0;
+ foreach ($apps as $app) {
+ $count += $app->getCount($notification);
+ }
+
+ return $count;
+ }
+}
diff --git a/lib/private/Notification/Notification.php b/lib/private/Notification/Notification.php
new file mode 100644
index 00000000000..db0a76a7c32
--- /dev/null
+++ b/lib/private/Notification/Notification.php
@@ -0,0 +1,453 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ * @author Morris Jobke <hey@morrisjobke.de>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OC\Notification;
+
+
+use OCP\Notification\IAction;
+use OCP\Notification\INotification;
+
+class Notification implements INotification {
+ /** @var string */
+ protected $app;
+
+ /** @var string */
+ protected $user;
+
+ /** @var \DateTime */
+ protected $dateTime;
+
+ /** @var string */
+ protected $objectType;
+
+ /** @var string */
+ protected $objectId;
+
+ /** @var string */
+ protected $subject;
+
+ /** @var array */
+ protected $subjectParameters;
+
+ /** @var string */
+ protected $subjectParsed;
+
+ /** @var string */
+ protected $message;
+
+ /** @var array */
+ protected $messageParameters;
+
+ /** @var string */
+ protected $messageParsed;
+
+ /** @var string */
+ protected $link;
+
+ /** @var string */
+ protected $icon;
+
+ /** @var array */
+ protected $actions;
+
+ /** @var array */
+ protected $actionsParsed;
+
+ /** @var bool */
+ protected $hasPrimaryAction;
+
+ /** @var bool */
+ protected $hasPrimaryParsedAction;
+
+ /**
+ * Constructor
+ */
+ public function __construct() {
+ $this->app = '';
+ $this->user = '';
+ $this->dateTime = new \DateTime();
+ $this->dateTime->setTimestamp(0);
+ $this->objectType = '';
+ $this->objectId = '';
+ $this->subject = '';
+ $this->subjectParameters = [];
+ $this->subjectParsed = '';
+ $this->message = '';
+ $this->messageParameters = [];
+ $this->messageParsed = '';
+ $this->link = '';
+ $this->icon = '';
+ $this->actions = [];
+ $this->actionsParsed = [];
+ }
+
+ /**
+ * @param string $app
+ * @return $this
+ * @throws \InvalidArgumentException if the app id is invalid
+ * @since 8.2.0
+ */
+ public function setApp($app) {
+ if (!is_string($app) || $app === '' || isset($app[32])) {
+ throw new \InvalidArgumentException('The given app name is invalid');
+ }
+ $this->app = $app;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getApp() {
+ return $this->app;
+ }
+
+ /**
+ * @param string $user
+ * @return $this
+ * @throws \InvalidArgumentException if the user id is invalid
+ * @since 8.2.0
+ */
+ public function setUser($user) {
+ if (!is_string($user) || $user === '' || isset($user[64])) {
+ throw new \InvalidArgumentException('The given user id is invalid');
+ }
+ $this->user = $user;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getUser() {
+ return $this->user;
+ }
+
+ /**
+ * @param \DateTime $dateTime
+ * @return $this
+ * @throws \InvalidArgumentException if the $dateTime is invalid
+ * @since 9.0.0
+ */
+ public function setDateTime(\DateTime $dateTime) {
+ if ($dateTime->getTimestamp() === 0) {
+ throw new \InvalidArgumentException('The given date time is invalid');
+ }
+ $this->dateTime = $dateTime;
+ return $this;
+ }
+
+ /**
+ * @return \DateTime
+ * @since 9.0.0
+ */
+ public function getDateTime() {
+ return $this->dateTime;
+ }
+
+ /**
+ * @param string $type
+ * @param string $id
+ * @return $this
+ * @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($type, $id) {
+ if (!is_string($type) || $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]))) {
+ throw new \InvalidArgumentException('The given object id is invalid');
+ }
+ $this->objectId = (string) $id;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getObjectType() {
+ return $this->objectType;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0 - 9.0.0: Return type changed to string
+ */
+ public function getObjectId() {
+ return $this->objectId;
+ }
+
+ /**
+ * @param string $subject
+ * @param array $parameters
+ * @return $this
+ * @throws \InvalidArgumentException if the subject or parameters are invalid
+ * @since 8.2.0
+ */
+ public function setSubject($subject, array $parameters = []) {
+ if (!is_string($subject) || $subject === '' || isset($subject[64])) {
+ throw new \InvalidArgumentException('The given subject is invalid');
+ }
+ $this->subject = $subject;
+
+ if (!is_array($parameters)) {
+ throw new \InvalidArgumentException('The given subject parameters are invalid');
+ }
+ $this->subjectParameters = $parameters;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getSubject() {
+ return $this->subject;
+ }
+
+ /**
+ * @return string[]
+ * @since 8.2.0
+ */
+ public function getSubjectParameters() {
+ return $this->subjectParameters;
+ }
+
+ /**
+ * @param string $subject
+ * @return $this
+ * @throws \InvalidArgumentException if the subject are invalid
+ * @since 8.2.0
+ */
+ public function setParsedSubject($subject) {
+ if (!is_string($subject) || $subject === '') {
+ throw new \InvalidArgumentException('The given parsed subject is invalid');
+ }
+ $this->subjectParsed = $subject;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getParsedSubject() {
+ return $this->subjectParsed;
+ }
+
+ /**
+ * @param string $message
+ * @param array $parameters
+ * @return $this
+ * @throws \InvalidArgumentException if the message or parameters are invalid
+ * @since 8.2.0
+ */
+ public function setMessage($message, array $parameters = []) {
+ if (!is_string($message) || $message === '' || isset($message[64])) {
+ throw new \InvalidArgumentException('The given message is invalid');
+ }
+ $this->message = $message;
+
+ if (!is_array($parameters)) {
+ throw new \InvalidArgumentException('The given message parameters are invalid');
+ }
+ $this->messageParameters = $parameters;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getMessage() {
+ return $this->message;
+ }
+
+ /**
+ * @return string[]
+ * @since 8.2.0
+ */
+ public function getMessageParameters() {
+ return $this->messageParameters;
+ }
+
+ /**
+ * @param string $message
+ * @return $this
+ * @throws \InvalidArgumentException if the message are invalid
+ * @since 8.2.0
+ */
+ public function setParsedMessage($message) {
+ if (!is_string($message) || $message === '') {
+ throw new \InvalidArgumentException('The given parsed message is invalid');
+ }
+ $this->messageParsed = $message;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getParsedMessage() {
+ return $this->messageParsed;
+ }
+
+ /**
+ * @param string $link
+ * @return $this
+ * @throws \InvalidArgumentException if the link are invalid
+ * @since 8.2.0
+ */
+ public function setLink($link) {
+ if (!is_string($link) || $link === '' || isset($link[4000])) {
+ throw new \InvalidArgumentException('The given link is invalid');
+ }
+ $this->link = $link;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getLink() {
+ return $this->link;
+ }
+
+ /**
+ * @return IAction
+ * @since 8.2.0
+ */
+ public function createAction() {
+ return new Action();
+ }
+
+ /**
+ * @param IAction $action
+ * @return $this
+ * @throws \InvalidArgumentException if the action are invalid
+ * @since 8.2.0
+ */
+ public function addAction(IAction $action) {
+ if (!$action->isValid()) {
+ throw new \InvalidArgumentException('The given action is invalid');
+ }
+
+ if ($action->isPrimary()) {
+ if ($this->hasPrimaryAction) {
+ throw new \InvalidArgumentException('The notification already has a primary action');
+ }
+
+ $this->hasPrimaryAction = true;
+ }
+
+ $this->actions[] = $action;
+ return $this;
+ }
+
+ /**
+ * @return IAction[]
+ * @since 8.2.0
+ */
+ public function getActions() {
+ return $this->actions;
+ }
+
+ /**
+ * @param IAction $action
+ * @return $this
+ * @throws \InvalidArgumentException if the action are invalid
+ * @since 8.2.0
+ */
+ public function addParsedAction(IAction $action) {
+ if (!$action->isValidParsed()) {
+ throw new \InvalidArgumentException('The given parsed action is invalid');
+ }
+
+ if ($action->isPrimary()) {
+ if ($this->hasPrimaryParsedAction) {
+ throw new \InvalidArgumentException('The notification already has a primary action');
+ }
+
+ $this->hasPrimaryParsedAction = true;
+ }
+
+ $this->actionsParsed[] = $action;
+ return $this;
+ }
+
+ /**
+ * @return IAction[]
+ * @since 8.2.0
+ */
+ public function getParsedActions() {
+ return $this->actionsParsed;
+ }
+
+ /**
+ * @return bool
+ * @since 8.2.0
+ */
+ public function isValid() {
+ return
+ $this->isValidCommon()
+ &&
+ $this->getSubject() !== ''
+ ;
+ }
+
+ /**
+ * @return bool
+ * @since 8.2.0
+ */
+ public function isValidParsed() {
+ return
+ $this->isValidCommon()
+ &&
+ $this->getParsedSubject() !== ''
+ ;
+ }
+
+ /**
+ * @return bool
+ */
+ protected function isValidCommon() {
+ return
+ $this->getApp() !== ''
+ &&
+ $this->getUser() !== ''
+ &&
+ $this->getDateTime()->getTimestamp() !== 0
+ &&
+ $this->getObjectType() !== ''
+ &&
+ $this->getObjectId() !== ''
+ ;
+ }
+}