summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorMaxence Lange <maxence@artificial-owl.com>2018-12-29 12:49:31 -0100
committerMaxence Lange <maxence@artificial-owl.com>2019-05-03 20:54:14 -0100
commit27a4785650f0d571ca97fb5ad832ee8cdb817e47 (patch)
tree43798ead6f7c3c3a7f2e32c1ce8b14c826f86712 /lib
parent35c4827f83a356012f800e903c86b54be43a98d5 (diff)
managing Notifications in the notification steam
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
Diffstat (limited to 'lib')
-rw-r--r--lib/AP.php19
-rw-r--r--lib/Db/CoreRequestBuilder.php11
-rw-r--r--lib/Db/NotesRequest.php41
-rw-r--r--lib/Db/NotesRequestBuilder.php24
-rw-r--r--lib/Interfaces/Internal/SocialAppNotificationInterface.php133
-rw-r--r--lib/Model/ActivityPub/ACore.php4
-rw-r--r--lib/Model/ActivityPub/Internal/SocialAppNotification.php85
-rw-r--r--lib/Model/ActivityPub/Item.php22
8 files changed, 322 insertions, 17 deletions
diff --git a/lib/AP.php b/lib/AP.php
index 7d8ae585..02775f55 100644
--- a/lib/AP.php
+++ b/lib/AP.php
@@ -48,6 +48,7 @@ use OCA\Social\Interfaces\Activity\UndoInterface;
use OCA\Social\Interfaces\Activity\UpdateInterface;
use OCA\Social\Interfaces\Actor\PersonInterface;
use OCA\Social\Interfaces\IActivityPubInterface;
+use OCA\Social\Interfaces\Internal\SocialAppNotificationInterface;
use OCA\Social\Interfaces\Object\DocumentInterface;
use OCA\Social\Interfaces\Object\ImageInterface;
use OCA\Social\Interfaces\Object\AnnounceInterface;
@@ -69,6 +70,7 @@ use OCA\Social\Model\ActivityPub\Object\Announce;
use OCA\Social\Model\ActivityPub\Object\Document;
use OCA\Social\Model\ActivityPub\Object\Image;
use OCA\Social\Model\ActivityPub\Object\Note;
+use OCA\Social\Model\ActivityPub\Internal\SocialAppNotification;
use OCA\Social\Model\ActivityPub\Object\Tombstone;
use OCA\Social\Service\ConfigService;
use OCP\AppFramework\QueryException;
@@ -136,6 +138,9 @@ class AP {
/** @var UpdateInterface */
public $updateInterface;
+ /** @var NotificationInterface */
+ public $notificationInterface;
+
/** @var ConfigService */
public $configService;
@@ -167,10 +172,11 @@ class AP {
$ap->followInterface = \OC::$server->query(FollowInterface::class);
$ap->imageInterface = \OC::$server->query(ImageInterface::class);
$ap->likeInterface = \OC::$server->query(LikeInterface::class);
+ $ap->noteInterface = \OC::$server->query(NoteInterface::class);
+ $ap->notificationInterface = \OC::$server->query(SocialAppNotificationInterface::class);
+ $ap->personInterface = \OC::$server->query(PersonInterface::class);
$ap->rejectInterface = \OC::$server->query(RejectInterface::class);
$ap->removeInterface = \OC::$server->query(RemoveInterface::class);
- $ap->personInterface = \OC::$server->query(PersonInterface::class);
- $ap->noteInterface = \OC::$server->query(NoteInterface::class);
$ap->undoInterface = \OC::$server->query(UndoInterface::class);
$ap->updateInterface = \OC::$server->query(UpdateInterface::class);
@@ -178,6 +184,8 @@ class AP {
AP::$activityPub = $ap;
} catch (QueryException $e) {
+ \OC::$server->getLogger()
+ ->logException($e);
}
}
@@ -303,6 +311,9 @@ class AP {
$item = new Note();
break;
+ case SocialAppNotification::TYPE:
+ return new SocialAppNotification();
+
case Person::TYPE:
$item = new Person();
break;
@@ -400,6 +411,10 @@ class AP {
$interface = $this->noteInterface;
break;
+ case SocialAppNotification::TYPE:
+ $service = $this->notificationInterface;
+ break;
+
case Person::TYPE:
$interface = $this->personInterface;
break;
diff --git a/lib/Db/CoreRequestBuilder.php b/lib/Db/CoreRequestBuilder.php
index 04848859..6e989a38 100644
--- a/lib/Db/CoreRequestBuilder.php
+++ b/lib/Db/CoreRequestBuilder.php
@@ -143,6 +143,17 @@ class CoreRequestBuilder {
/**
+ * Limit the request to the Type
+ *
+ * @param IQueryBuilder $qb
+ * @param string $type
+ */
+ protected function limitToType(IQueryBuilder &$qb, string $type) {
+ $this->limitToDBField($qb, 'id', $type, false);
+ }
+
+
+ /**
* Limit the request to the UserId
*
* @param IQueryBuilder $qb
diff --git a/lib/Db/NotesRequest.php b/lib/Db/NotesRequest.php
index 30f83c64..d5d8ed9d 100644
--- a/lib/Db/NotesRequest.php
+++ b/lib/Db/NotesRequest.php
@@ -116,6 +116,7 @@ class NotesRequest extends NotesRequestBuilder {
$qb = $this->getNotesSelectSql();
$this->limitToIdString($qb, $id);
+ $this->limitToType($qb, Note::TYPE);
if ($asViewer) {
$this->limitToViewer($qb);
@@ -130,7 +131,14 @@ class NotesRequest extends NotesRequestBuilder {
throw new NoteNotFoundException('Post not found');
}
- return $this->parseNotesSelectSql($data);
+ try {
+ /** @var Note $note */
+ $note = $this->parseNotesSelectSql($data);
+ } catch (Exception $e) {
+ throw new NoteNotFoundException('Malformed Post');
+ }
+
+ return $note;
}
@@ -202,6 +210,7 @@ class NotesRequest extends NotesRequestBuilder {
public function countNotesFromActorId(string $actorId): int {
$qb = $this->countNotesSelectSql();
$this->limitToAttributedTo($qb, $actorId);
+ $this->limitToType($qb, Note::TYPE);
$cursor = $qb->execute();
$data = $cursor->fetch();
@@ -227,6 +236,7 @@ class NotesRequest extends NotesRequestBuilder {
$qb = $this->getNotesSelectSql();
$this->joinFollowing($qb, $actor);
+ $this->limitToType($qb, Note::TYPE);
$this->limitPaginate($qb, $since, $limit);
$this->leftJoinCacheActors($qb, 'attributed_to');
$this->leftJoinStreamAction($qb);
@@ -234,7 +244,10 @@ class NotesRequest extends NotesRequestBuilder {
$notes = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
- $notes[] = $this->parseNotesSelectSql($data);
+ try {
+ $notes[] = $this->parseNotesSelectSql($data);
+ } catch (Exception $e) {
+ }
}
$cursor->closeCursor();
@@ -268,7 +281,10 @@ class NotesRequest extends NotesRequestBuilder {
$notes = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
- $notes[] = $this->parseNotesSelectSql($data);
+ try {
+ $notes[] = $this->parseNotesSelectSql($data);
+ } catch (Exception $e) {
+ }
}
$cursor->closeCursor();
@@ -291,6 +307,7 @@ class NotesRequest extends NotesRequestBuilder {
public function getStreamAccount(string $actorId, int $since = 0, int $limit = 5): array {
$qb = $this->getNotesSelectSql();
$this->limitPaginate($qb, $since, $limit);
+ $this->limitToType($qb, Note::TYPE);
$this->limitToAttributedTo($qb, $actorId);
$this->leftJoinCacheActors($qb, 'attributed_to');
$this->limitToRecipient($qb, ACore::CONTEXT_PUBLIC);
@@ -299,7 +316,10 @@ class NotesRequest extends NotesRequestBuilder {
$notes = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
- $notes[] = $this->parseNotesSelectSql($data);
+ try {
+ $notes[] = $this->parseNotesSelectSql($data);
+ } catch (Exception $e) {
+ }
}
$cursor->closeCursor();
@@ -323,6 +343,7 @@ class NotesRequest extends NotesRequestBuilder {
$qb = $this->getNotesSelectSql();
$this->limitPaginate($qb, $since, $limit);
+ $this->limitToType($qb, Note::TYPE);
$this->limitToRecipient($qb, $actor->getId(), true);
$this->filterToRecipient($qb, ACore::CONTEXT_PUBLIC);
$this->filterToRecipient($qb, $actor->getFollowers());
@@ -332,7 +353,10 @@ class NotesRequest extends NotesRequestBuilder {
$notes = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
- $notes[] = $this->parseNotesSelectSql($data);
+ try {
+ $notes[] = $this->parseNotesSelectSql($data);
+ } catch (Exception $e) {
+ }
}
$cursor->closeCursor();
@@ -355,6 +379,7 @@ class NotesRequest extends NotesRequestBuilder {
): array {
$qb = $this->getNotesSelectSql();
$this->limitPaginate($qb, $since, $limit);
+ $this->limitToType($qb, Note::TYPE);
if ($localOnly) {
$this->limitToLocal($qb, true);
}
@@ -367,7 +392,10 @@ class NotesRequest extends NotesRequestBuilder {
$notes = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
- $notes[] = $this->parseNotesSelectSql($data);
+ try {
+ $notes[] = $this->parseNotesSelectSql($data);
+ } catch (Exception $e) {
+ }
}
$cursor->closeCursor();
@@ -442,6 +470,7 @@ class NotesRequest extends NotesRequestBuilder {
*/
public function deleteNoteById(string $id) {
$qb = $this->getNotesDeleteSql();
+ $this->limitToType($qb, Note::TYPE);
$this->limitToIdString($qb, $id);
$qb->execute();
diff --git a/lib/Db/NotesRequestBuilder.php b/lib/Db/NotesRequestBuilder.php
index e9a64312..67dba3be 100644
--- a/lib/Db/NotesRequestBuilder.php
+++ b/lib/Db/NotesRequestBuilder.php
@@ -32,11 +32,17 @@ namespace OCA\Social\Db;
use daita\MySmallPhpTools\Traits\TArrayTools;
use Doctrine\DBAL\Query\QueryBuilder;
+use OCA\Social\AP;
use OCA\Social\Exceptions\InvalidResourceException;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Model\ActivityPub\Object\Note;
use OCA\Social\Model\ActivityPub\Stream;
+use OCA\Social\Exceptions\ItemUnknownException;
+use OCA\Social\Exceptions\RedundancyLimitException;
+use OCA\Social\Exceptions\SocialAppConfigException;
+use OCA\Social\Model\ActivityPub\ACore;
+use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Model\InstancePath;
use OCP\DB\QueryBuilder\ICompositeExpression;
use OCP\DB\QueryBuilder\IQueryBuilder;
@@ -354,25 +360,27 @@ class NotesRequestBuilder extends CoreRequestBuilder {
/**
* @param array $data
*
+ * @throws ItemUnknownException
+ * @throws RedundancyLimitException
+ * @throws SocialAppConfigException
* @return Stream
*/
- protected function parseNotesSelectSql($data): Stream {
- $note = new Note();
- $note->importFromDatabase($data);
+ protected function parseNotesSelectSql($data): ACore {
+ $item = AP::$activityPub->getItemFromData($data);
- $instances = json_decode($data['instances'], true);
+ $instances = json_decode($this->get('instances', $data, '[]'), true);
if (is_array($instances)) {
foreach ($instances as $instance) {
$instancePath = new InstancePath();
$instancePath->import($instance);
- $note->addInstancePath($instancePath);
+ $item->addInstancePath($instancePath);
}
}
try {
$actor = $this->parseCacheActorsLeftJoin($data);
- $note->setCompleteDetails(true);
- $note->setActor($actor);
+ $item->setCompleteDetails(true);
+ $item->setActor($actor);
} catch (InvalidResourceException $e) {
}
@@ -382,7 +390,7 @@ class NotesRequestBuilder extends CoreRequestBuilder {
} catch (InvalidResourceException $e) {
}
- return $note;
+ return $item;
}
}
diff --git a/lib/Interfaces/Internal/SocialAppNotificationInterface.php b/lib/Interfaces/Internal/SocialAppNotificationInterface.php
new file mode 100644
index 00000000..46dc8c56
--- /dev/null
+++ b/lib/Interfaces/Internal/SocialAppNotificationInterface.php
@@ -0,0 +1,133 @@
+<?php
+declare(strict_types=1);
+
+
+/**
+ * Nextcloud - Social Support
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Maxence Lange <maxence@artificial-owl.com>
+ * @copyright 2018, Maxence Lange <maxence@artificial-owl.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 OCA\Social\Interfaces\Internal;
+
+
+use OCA\Social\Db\NotesRequest;
+use OCA\Social\Exceptions\ItemNotFoundException;
+use OCA\Social\Interfaces\IActivityPubInterface;
+use OCA\Social\Model\ActivityPub\ACore;
+use OCA\Social\Model\ActivityPub\Internal\SocialAppNotification;
+use OCA\Social\Service\ConfigService;
+use OCA\Social\Service\CurlService;
+use OCA\Social\Service\MiscService;
+
+
+class SocialAppNotificationInterface implements IActivityPubInterface {
+
+
+ /** @var NotesRequest */
+ private $notesRequest;
+
+ /** @var CurlService */
+ private $curlService;
+
+ /** @var ConfigService */
+ private $configService;
+
+ /** @var MiscService */
+ private $miscService;
+
+
+ /**
+ * NoteInterface constructor.
+ *
+ * @param NotesRequest $notesRequest
+ * @param CurlService $curlService
+ * @param ConfigService $configService
+ * @param MiscService $miscService
+ */
+ public function __construct(
+ NotesRequest $notesRequest, CurlService $curlService, ConfigService $configService,
+ MiscService $miscService
+ ) {
+ $this->notesRequest = $notesRequest;
+ $this->curlService = $curlService;
+ $this->configService = $configService;
+ $this->miscService = $miscService;
+ }
+
+
+ /**
+ * @param ACore $note
+ */
+ public function processIncomingRequest(ACore $note) {
+ }
+
+
+ /**
+ * @param ACore $item
+ */
+ public function processResult(ACore $item) {
+ }
+
+
+ /**
+ * @param string $id
+ *
+ * @return ACore
+ * @throws ItemNotFoundException
+ */
+ public function getItemById(string $id): ACore {
+ throw new ItemNotFoundException();
+ }
+
+
+ /**
+ * @param ACore $note
+ */
+ public function save(ACore $note) {
+ /** @var SocialAppNotification $note */
+//
+// try {
+// $this->notesRequest->getNoteById($note->getId());
+// } catch (NoteNotFoundException $e) {
+// $this->notesRequest->save($note);
+// }
+ }
+
+
+ /**
+ * @param ACore $activity
+ * @param ACore $item
+ */
+ public function activity(Acore $activity, ACore $item) {
+ }
+
+
+ /**
+ * @param ACore $item
+ */
+ public function delete(ACore $item) {
+ }
+
+}
+
diff --git a/lib/Model/ActivityPub/ACore.php b/lib/Model/ActivityPub/ACore.php
index 9db0df3e..42c78152 100644
--- a/lib/Model/ActivityPub/ACore.php
+++ b/lib/Model/ActivityPub/ACore.php
@@ -577,6 +577,7 @@ class ACore extends Item implements JsonSerializable {
$this->setId($this->validate(self::AS_ID, 'id', $data, ''));
$this->setType($this->validate(self::AS_TYPE, 'type', $data, ''));
$this->setUrl($this->validate(self::AS_URL, 'url', $data, ''));
+ $this->setAttributedTo($this->validate(self::AS_ID, 'attributedTo', $data, ''));
$this->setSummary($this->get('summary', $data, ''));
$this->setToArray($this->validateArray(self::AS_ID, 'to', $data, []));
$this->setCcArray($this->validateArray(self::AS_ID, 'cc', $data, []));
@@ -594,6 +595,7 @@ class ACore extends Item implements JsonSerializable {
$this->setId($this->validate(self::AS_ID, 'id', $data, ''));
$this->setType($this->validate(self::AS_TYPE, 'type', $data, ''));
$this->setUrl($this->validate(self::AS_URL, 'url', $data, ''));
+ $this->setAttributedTo($this->validate(self::AS_ID, 'attributed_to', $data, ''));
$this->setSummary($this->validate(self::AS_STRING, 'summary', $data, ''));
$this->setTo($this->validate(self::AS_ID, 'to', $data, ''));
$this->setToArray($this->validateArray(self::AS_ID, 'to_array', $data, []));
@@ -629,7 +631,7 @@ class ACore extends Item implements JsonSerializable {
$this->addEntry('id', $this->getId());
$this->addEntry('type', $this->getType());
$this->addEntry('url', $this->getUrl());
-
+ $this->addEntry('attributedTo', $this->getAttributedTo());
$this->addEntry('to', $this->getTo());
$this->addEntryArray('to', $this->getToArray());
$this->addEntryArray('cc', $this->getCcArray());
diff --git a/lib/Model/ActivityPub/Internal/SocialAppNotification.php b/lib/Model/ActivityPub/Internal/SocialAppNotification.php
new file mode 100644
index 00000000..489de9f4
--- /dev/null
+++ b/lib/Model/ActivityPub/Internal/SocialAppNotification.php
@@ -0,0 +1,85 @@
+<?php
+declare(strict_types=1);
+
+
+/**
+ * Nextcloud - Social Support
+ *
+ * This file is licensed under the Affero General Public License version 3 or
+ * later. See the COPYING file.
+ *
+ * @author Maxence Lange <maxence@artificial-owl.com>
+ * @copyright 2018, Maxence Lange <maxence@artificial-owl.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 OCA\Social\Model\ActivityPub\Internal;
+
+
+use JsonSerializable;
+use OCA\Social\Model\ActivityPub\ACore;
+
+
+class SocialAppNotification extends ACore implements JsonSerializable {
+
+
+ const TYPE = 'SocialAppNotification';
+
+
+ /**
+ * Notification constructor.
+ *
+ * @param null $parent
+ */
+ public function __construct($parent = null) {
+ parent::__construct($parent);
+
+ $this->setType(self::TYPE);
+ }
+
+
+ /**
+ * @param array $data
+ */
+ public function import(array $data) {
+ parent::import($data);
+ }
+
+
+ /**
+ * @param array $data
+ */
+ public function importFromDatabase(array $data) {
+ parent::importFromDatabase($data);
+ }
+
+
+ /**
+ * @return array
+ */
+ public function jsonSerialize(): array {
+// $this->addEntryInt('publishedTime', $this->getPublishedTime());
+
+ return array_merge(
+ parent::jsonSerialize(),
+ [
+ ]
+ );
+ }
+
+}
+
diff --git a/lib/Model/ActivityPub/Item.php b/lib/Model/ActivityPub/Item.php
index f6f04af1..e1c2d4f5 100644
--- a/lib/Model/ActivityPub/Item.php
+++ b/lib/Model/ActivityPub/Item.php
@@ -60,6 +60,9 @@ class Item {
private $url = '';
/** @var string */
+ private $attributedTo = '';
+
+ /** @var string */
private $summary = '';
/** @var InstancePath[] */
@@ -175,6 +178,25 @@ class Item {
/**
+ * @return string
+ */
+ public function getAttributedTo(): string {
+ return $this->attributedTo;
+ }
+
+ /**
+ * @param string $attributedTo
+ *
+ * @return Item
+ */
+ public function setAttributedTo(string $attributedTo): Item {
+ $this->attributedTo = $attributedTo;
+
+ return $this;
+ }
+
+
+ /**
* @param InstancePath $instancePath
*
* @return Item