summaryrefslogtreecommitdiffstats
path: root/lib/private
diff options
context:
space:
mode:
authorLukas Reschke <lukas@owncloud.com>2015-09-10 15:26:36 +0200
committerLukas Reschke <lukas@owncloud.com>2015-09-10 15:26:36 +0200
commitfb717f254fe81065912c13e0907ba374c8167f98 (patch)
tree1a34b7c8bed92bb5686d73a1521998b2057276cf /lib/private
parent89cd9295600f6707579240f3f010d4b75a2d85cd (diff)
parent38001d824b142ca9c47f2afafce91ab8b76f1a9a (diff)
downloadnextcloud-server-fb717f254fe81065912c13e0907ba374c8167f98.tar.gz
nextcloud-server-fb717f254fe81065912c13e0907ba374c8167f98.zip
Merge pull request #18699 from owncloud/notification-manager
Notification manager
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/notification/action.php167
-rw-r--r--lib/private/notification/iaction.php109
-rw-r--r--lib/private/notification/iapp.php56
-rw-r--r--lib/private/notification/imanager.php56
-rw-r--r--lib/private/notification/inotification.php241
-rw-r--r--lib/private/notification/inotifier.php43
-rw-r--r--lib/private/notification/manager.php191
-rw-r--r--lib/private/notification/notification.php446
-rw-r--r--lib/private/server.php14
9 files changed, 1323 insertions, 0 deletions
diff --git a/lib/private/notification/action.php b/lib/private/notification/action.php
new file mode 100644
index 00000000000..6de8a1a4bbc
--- /dev/null
+++ b/lib/private/notification/action.php
@@ -0,0 +1,167 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, 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;
+
+
+class Action implements IAction {
+
+ /** @var string */
+ protected $label;
+
+ /** @var string */
+ protected $labelParsed;
+
+ /** @var string */
+ protected $link;
+
+ /** @var string */
+ protected $requestType;
+
+ /** @var string */
+ protected $icon;
+
+ /**
+ * Constructor
+ */
+ public function __construct() {
+ $this->label = '';
+ $this->labelParsed = '';
+ $this->link = '';
+ $this->requestType = '';
+ $this->icon = '';
+ }
+
+ /**
+ * @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 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;
+ }
+
+ /**
+ * @param string $icon
+ * @return $this
+ * @throws \InvalidArgumentException if the icon is invalid
+ * @since 8.2.0
+ */
+ public function setIcon($icon) {
+ if (!is_string($icon) || $icon === '' || isset($icon[64])) {
+ throw new \InvalidArgumentException('The given icon is invalid');
+ }
+ $this->icon = $icon;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getIcon() {
+ return $this->icon;
+ }
+
+ /**
+ * @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/iaction.php b/lib/private/notification/iaction.php
new file mode 100644
index 00000000000..da6728f5c52
--- /dev/null
+++ b/lib/private/notification/iaction.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, 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;
+
+/**
+ * Interface IAction
+ *
+ * @package OC\Notification
+ * @since 8.2.0
+ *
+ * DEVELOPER NOTE:
+ * The notification api is experimental only in 8.2.0! Do not start using it,
+ * if you can not prepare an update for the next version afterwards.
+ */
+interface IAction {
+ /**
+ * @param string $label
+ * @return $this
+ * @throws \InvalidArgumentException if the label is invalid
+ * @since 8.2.0
+ */
+ public function setLabel($label);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getLabel();
+
+ /**
+ * @param string $label
+ * @return $this
+ * @throws \InvalidArgumentException if the label is invalid
+ * @since 8.2.0
+ */
+ public function setParsedLabel($label);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getParsedLabel();
+
+ /**
+ * @param string $link
+ * @param string $requestType
+ * @return $this
+ * @throws \InvalidArgumentException if the link is invalid
+ * @since 8.2.0
+ */
+ public function setLink($link, $requestType);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getLink();
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getRequestType();
+
+ /**
+ * @param string $icon
+ * @return $this
+ * @throws \InvalidArgumentException if the icon is invalid
+ * @since 8.2.0
+ */
+ public function setIcon($icon);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getIcon();
+
+ /**
+ * @return bool
+ * @since 8.2.0
+ */
+ public function isValid();
+
+ /**
+ * @return bool
+ * @since 8.2.0
+ */
+ public function isValidParsed();
+}
diff --git a/lib/private/notification/iapp.php b/lib/private/notification/iapp.php
new file mode 100644
index 00000000000..eda66423f3a
--- /dev/null
+++ b/lib/private/notification/iapp.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, 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;
+
+/**
+ * Interface IApp
+ *
+ * @package OC\Notification
+ * @since 8.2.0
+ *
+ * DEVELOPER NOTE:
+ * The notification api is experimental only in 8.2.0! Do not start using it,
+ * if you can not prepare an update for the next version afterwards.
+ */
+interface IApp {
+ /**
+ * @param INotification $notification
+ * @return null
+ * @throws \InvalidArgumentException When the notification is not valid
+ * @since 8.2.0
+ */
+ public function notify(INotification $notification);
+
+ /**
+ * @param INotification $notification
+ * @return null
+ * @since 8.2.0
+ */
+ public function markProcessed(INotification $notification);
+
+ /**
+ * @param INotification $notification
+ * @return int
+ * @since 8.2.0
+ */
+ public function getCount(INotification $notification);
+}
diff --git a/lib/private/notification/imanager.php b/lib/private/notification/imanager.php
new file mode 100644
index 00000000000..0cd92b33251
--- /dev/null
+++ b/lib/private/notification/imanager.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, 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;
+
+/**
+ * Interface IManager
+ *
+ * @package OC\Notification
+ * @since 8.2.0
+ *
+ * DEVELOPER NOTE:
+ * The notification api is experimental only in 8.2.0! Do not start using it,
+ * if you can not prepare an update for the next version afterwards.
+ */
+interface IManager extends IApp, INotifier {
+ /**
+ * @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);
+
+ /**
+ * @param \Closure $service The service must implement INotifier, otherwise a
+ * \InvalidArgumentException is thrown later
+ * @return null
+ * @since 8.2.0
+ */
+ public function registerNotifier(\Closure $service);
+
+ /**
+ * @return INotification
+ * @since 8.2.0
+ */
+ public function createNotification();
+}
diff --git a/lib/private/notification/inotification.php b/lib/private/notification/inotification.php
new file mode 100644
index 00000000000..faf5db1d24c
--- /dev/null
+++ b/lib/private/notification/inotification.php
@@ -0,0 +1,241 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, 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;
+
+/**
+ * Interface INotification
+ *
+ * @package OC\Notification
+ * @since 8.2.0
+ *
+ * DEVELOPER NOTE:
+ * The notification api is experimental only in 8.2.0! Do not start using it,
+ * if you can not prepare an update for the next version afterwards.
+ */
+interface INotification {
+ /**
+ * @param string $app
+ * @return $this
+ * @throws \InvalidArgumentException if the app id are invalid
+ * @since 8.2.0
+ */
+ public function setApp($app);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getApp();
+
+ /**
+ * @param string $user
+ * @return $this
+ * @throws \InvalidArgumentException if the user id are invalid
+ * @since 8.2.0
+ */
+ public function setUser($user);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getUser();
+
+ /**
+ * @param int $timestamp
+ * @return $this
+ * @throws \InvalidArgumentException if the timestamp are invalid
+ * @since 8.2.0
+ */
+ public function setTimestamp($timestamp);
+
+ /**
+ * @return int
+ * @since 8.2.0
+ */
+ public function getTimestamp();
+
+ /**
+ * @param string $type
+ * @param int $id
+ * @return $this
+ * @throws \InvalidArgumentException if the object type or id are invalid
+ * @since 8.2.0
+ */
+ public function setObject($type, $id);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getObjectType();
+
+ /**
+ * @return int
+ * @since 8.2.0
+ */
+ public function getObjectId();
+
+ /**
+ * @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 = []);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getSubject();
+
+ /**
+ * @return string[]
+ * @since 8.2.0
+ */
+ public function getSubjectParameters();
+
+ /**
+ * @param string $subject
+ * @return $this
+ * @throws \InvalidArgumentException if the subject are invalid
+ * @since 8.2.0
+ */
+ public function setParsedSubject($subject);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getParsedSubject();
+
+ /**
+ * @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 = []);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getMessage();
+
+ /**
+ * @return string[]
+ * @since 8.2.0
+ */
+ public function getMessageParameters();
+
+ /**
+ * @param string $message
+ * @return $this
+ * @throws \InvalidArgumentException if the message are invalid
+ * @since 8.2.0
+ */
+ public function setParsedMessage($message);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getParsedMessage();
+
+ /**
+ * @param string $link
+ * @return $this
+ * @throws \InvalidArgumentException if the link are invalid
+ * @since 8.2.0
+ */
+ public function setLink($link);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getLink();
+
+ /**
+ * @param string $icon
+ * @return $this
+ * @throws \InvalidArgumentException if the icon are invalid
+ * @since 8.2.0
+ */
+ public function setIcon($icon);
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getIcon();
+
+ /**
+ * @return IAction
+ * @since 8.2.0
+ */
+ public function createAction();
+
+ /**
+ * @param IAction $action
+ * @return $this
+ * @throws \InvalidArgumentException if the action are invalid
+ * @since 8.2.0
+ */
+ public function addAction(IAction $action);
+
+ /**
+ * @return IAction[]
+ * @since 8.2.0
+ */
+ public function getActions();
+
+ /**
+ * @param IAction $action
+ * @return $this
+ * @throws \InvalidArgumentException if the action are invalid
+ * @since 8.2.0
+ */
+ public function addParsedAction(IAction $action);
+
+ /**
+ * @return IAction[]
+ * @since 8.2.0
+ */
+ public function getParsedActions();
+
+ /**
+ * @return bool
+ * @since 8.2.0
+ */
+ public function isValid();
+
+ /**
+ * @return bool
+ * @since 8.2.0
+ */
+ public function isValidParsed();
+}
diff --git a/lib/private/notification/inotifier.php b/lib/private/notification/inotifier.php
new file mode 100644
index 00000000000..22531229e3f
--- /dev/null
+++ b/lib/private/notification/inotifier.php
@@ -0,0 +1,43 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, 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;
+
+/**
+ * Interface INotifier
+ *
+ * @package OC\Notification
+ * @since 8.2.0
+ *
+ * DEVELOPER NOTE:
+ * The notification api is experimental only in 8.2.0! Do not start using it,
+ * if you can not prepare an update for the next version afterwards.
+ */
+interface INotifier {
+ /**
+ * @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);
+}
diff --git a/lib/private/notification/manager.php b/lib/private/notification/manager.php
new file mode 100644
index 00000000000..9635925e38e
--- /dev/null
+++ b/lib/private/notification/manager.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, 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;
+
+
+class Manager implements IManager {
+ /** @var IApp */
+ protected $apps;
+
+ /** @var INotifier */
+ protected $notifiers;
+
+ /** @var \Closure */
+ protected $appsClosures;
+
+ /** @var \Closure */
+ protected $notifiersClosures;
+
+ public function __construct() {
+ $this->apps = [];
+ $this->notifiers = [];
+ $this->appsClosures = [];
+ $this->notifiersClosures = [];
+ }
+
+ /**
+ * @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
+ * @return null
+ * @since 8.2.0
+ */
+ public function registerNotifier(\Closure $service) {
+ $this->notifiersClosures[] = $service;
+ $this->notifiers = [];
+ }
+
+ /**
+ * @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 notification app does not implement the INotifier interface');
+ }
+ $this->notifiers[] = $notifier;
+ }
+
+ return $this->notifiers;
+ }
+
+ /**
+ * @return INotification
+ * @since 8.2.0
+ */
+ public function createNotification() {
+ return new Notification();
+ }
+
+ /**
+ * @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..40fe39a956e
--- /dev/null
+++ b/lib/private/notification/notification.php
@@ -0,0 +1,446 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, 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;
+
+
+class Notification implements INotification {
+ /** @var string */
+ protected $app;
+
+ /** @var string */
+ protected $user;
+
+ /** @var int */
+ protected $timestamp;
+
+ /** @var string */
+ protected $objectType;
+
+ /** @var int */
+ 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;
+
+ /**
+ * Constructor
+ */
+ public function __construct() {
+ $this->app = '';
+ $this->user = '';
+ $this->timestamp = 0;
+ $this->objectType = '';
+ $this->objectId = 0;
+ $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 int $timestamp
+ * @return $this
+ * @throws \InvalidArgumentException if the timestamp is invalid
+ * @since 8.2.0
+ */
+ public function setTimestamp($timestamp) {
+ if (!is_int($timestamp)) {
+ throw new \InvalidArgumentException('The given timestamp is invalid');
+ }
+ $this->timestamp = $timestamp;
+ return $this;
+ }
+
+ /**
+ * @return int
+ * @since 8.2.0
+ */
+ public function getTimestamp() {
+ return $this->timestamp;
+ }
+
+ /**
+ * @param string $type
+ * @param int $id
+ * @return $this
+ * @throws \InvalidArgumentException if the object type or id is invalid
+ * @since 8.2.0
+ */
+ 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)) {
+ throw new \InvalidArgumentException('The given object id is invalid');
+ }
+ $this->objectId = $id;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getObjectType() {
+ return $this->objectType;
+ }
+
+ /**
+ * @return int
+ * @since 8.2.0
+ */
+ 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;
+ }
+
+ /**
+ * @param string $icon
+ * @return $this
+ * @throws \InvalidArgumentException if the icon are invalid
+ * @since 8.2.0
+ */
+ public function setIcon($icon) {
+ if (!is_string($icon) || $icon === '' || isset($icon[64])) {
+ throw new \InvalidArgumentException('The given icon is invalid');
+ }
+ $this->icon = $icon;
+ return $this;
+ }
+
+ /**
+ * @return string
+ * @since 8.2.0
+ */
+ public function getIcon() {
+ return $this->icon;
+ }
+
+ /**
+ * @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');
+ }
+ $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');
+ }
+ $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->getTimestamp() !== 0
+ &&
+ $this->getObjectType() !== ''
+ &&
+ $this->getObjectId() !== 0
+ ;
+ }
+}
diff --git a/lib/private/server.php b/lib/private/server.php
index 346761840d6..bbf060a47b7 100644
--- a/lib/private/server.php
+++ b/lib/private/server.php
@@ -53,6 +53,7 @@ use OC\Lock\DBLockingProvider;
use OC\Lock\MemcacheLockingProvider;
use OC\Lock\NoopLockingProvider;
use OC\Mail\Mailer;
+use OC\Notification\Manager;
use OC\Security\CertificateManager;
use OC\Security\Crypto;
use OC\Security\Hasher;
@@ -473,6 +474,9 @@ class Server extends SimpleContainer implements IServerContainer {
$c->getDatabaseConnection()
);
});
+ $this->registerService('NotificationManager', function() {
+ return new Manager();
+ });
$this->registerService('CapabilitiesManager', function (Server $c) {
$manager = new \OC\CapabilitiesManager();
$manager->registerCapability(function() use ($c) {
@@ -1042,6 +1046,16 @@ class Server extends SimpleContainer implements IServerContainer {
}
/**
+ * Get the Notification Manager
+ *
+ * @return \OC\Notification\IManager
+ * @since 8.2.0
+ */
+ public function getNotificationManager() {
+ return $this->query('NotificationManager');
+ }
+
+ /**
* @return \OC\Session\CryptoWrapper
*/
public function getSessionCryptoWrapper() {