diff options
author | Maxence Lange <maxence@artificial-owl.com> | 2019-05-16 16:46:06 -0100 |
---|---|---|
committer | Maxence Lange <maxence@artificial-owl.com> | 2019-05-16 16:46:06 -0100 |
commit | d16537b403a0ee29f6c4d5d99c9e8cadd7a201e3 (patch) | |
tree | f920c293f47a15947e94e59503e3fa3ef475eb51 /lib/Db/NotesRequest.php | |
parent | 7d5ea91b58fce9e95b8e524ab8a6fed5858c2794 (diff) |
Notes -> Stream
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
Diffstat (limited to 'lib/Db/NotesRequest.php')
-rw-r--r-- | lib/Db/NotesRequest.php | 617 |
1 files changed, 0 insertions, 617 deletions
diff --git a/lib/Db/NotesRequest.php b/lib/Db/NotesRequest.php deleted file mode 100644 index 5bbf2478..00000000 --- a/lib/Db/NotesRequest.php +++ /dev/null @@ -1,617 +0,0 @@ -<?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\Db; - - -use daita\MySmallPhpTools\Model\Cache; -use DateTime; -use Doctrine\DBAL\Exception\UniqueConstraintViolationException; -use Exception; -use OCA\Social\Exceptions\NoteNotFoundException; -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\Service\ConfigService; -use OCA\Social\Service\MiscService; -use OCP\DB\QueryBuilder\IQueryBuilder; -use OCP\IDBConnection; - -class NotesRequest extends NotesRequestBuilder { - - - /** - * NotesRequest constructor. - * - * @param IDBConnection $connection - * @param ConfigService $configService - * @param MiscService $miscService - */ - public function __construct( - IDBConnection $connection, ConfigService $configService, MiscService $miscService - ) { - parent::__construct($connection, $configService, $miscService); - } - - - /** - * @param Stream $stream - * - * @throws Exception - */ - public function save(Stream $stream) { - $qb = $this->saveStream($stream); - - if ($stream->getType() === Note::TYPE) { - /** @var Note $stream */ - $qb->setValue( - 'hashtags', $qb->createNamedParameter(json_encode($stream->getHashtags())) - ) - ->setValue( - 'attachments', $qb->createNamedParameter( - json_encode($stream->getAttachments(), JSON_UNESCAPED_SLASHES) - ) - ); - } - - $qb->execute(); - } - - - -// -// -// /** -// * Insert a new Note in the database. -// * -// * @param SocialAppNotification $notification -// * -// * @throws Exception -// */ -// public function saveNotification(SocialAppNotification $notification) { -// $qb = $this->getNotesInsertSql(); -// $qb->setValue('id', $qb->createNamedParameter($notification->getId())) -// ->setValue('type', $qb->createNamedParameter($notification->getType())) -// ->setValue('to', $qb->createNamedParameter($notification->getTo())) -// ->setValue('to_array', $qb->createNamedParameter('')) -// ->setValue('cc', $qb->createNamedParameter('')) -// ->setValue('bcc', $qb->createNamedParameter('')) -// ->setValue('content', $qb->createNamedParameter('')) -// ->setValue('summary', $qb->createNamedParameter($notification->getSummary())) -// ->setValue('published', $qb->createNamedParameter($notification->getPublished())) -// ->setValue( -// 'published_time', -// $qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE) -// ) -// ->setValue('attributed_to', $qb->createNamedParameter($notification->getAttributedTo())) -// ->setValue('in_reply_to', $qb->createNamedParameter('')) -// ->setValue('source', $qb->createNamedParameter($notification->getSource())) -// ->setValue('instances', $qb->createNamedParameter('')) -// ->setValue('local', $qb->createNamedParameter(($notification->isLocal()) ? '1' : '0')) -// ->setValue( -// 'creation', -// $qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE) -// ); -// -// $qb->execute(); -// } - - - /** - * @param Stream $stream - * @param Cache $cache - */ - public function updateCache(Stream $stream, Cache $cache) { - $qb = $this->getNotesUpdateSql(); - $qb->set('cache', $qb->createNamedParameter(json_encode($cache, JSON_UNESCAPED_SLASHES))); - - $this->limitToIdString($qb, $stream->getId()); - - try { - $qb->execute(); - } catch (UniqueConstraintViolationException $e) { - } - } - - - /** - * @param string $id - * @param bool $asViewer - * - * @return Stream - * @throws NoteNotFoundException - */ - public function getNoteById(string $id, bool $asViewer = false): Stream { - if ($id === '') { - throw new NoteNotFoundException(); - }; - - $qb = $this->getNotesSelectSql(); - $this->limitToIdString($qb, $id); - $this->leftJoinCacheActors($qb, 'attributed_to'); - - if ($asViewer) { - $this->limitToViewer($qb); - $this->leftJoinStreamAction($qb); - } - - $cursor = $qb->execute(); - $data = $cursor->fetch(); - $cursor->closeCursor(); - - if ($data === false) { - throw new NoteNotFoundException('Post not found'); - } - - try { - /** @var Note $note */ - $note = $this->parseNotesSelectSql($data); - } catch (Exception $e) { - throw new NoteNotFoundException('Malformed Post'); - } - - return $note; - } - - - /** - * @param string $id - * - * @return Stream - * @throws NoteNotFoundException - * @throws Exception - */ - public function getNoteByActivityId(string $id): Stream { - if ($id === '') { - throw new NoteNotFoundException(); - }; - - $qb = $this->getNotesSelectSql(); - $this->limitToActivityId($qb, $id); - - $cursor = $qb->execute(); - $data = $cursor->fetch(); - $cursor->closeCursor(); - - if ($data === false) { - throw new NoteNotFoundException('Post not found'); - } - - return $this->parseNotesSelectSql($data); - } - - - /** - * @param Person $actor - * @param string $type - * - * @param string $objectId - * - * @return Stream - * @throws NoteNotFoundException - */ - public function getNoteByObjectId(Person $actor, string $type, string $objectId): Stream { - if ($objectId === '') { - throw new NoteNotFoundException('missing objectId'); - }; - - $qb = $this->getNotesSelectSql(); - $this->limitToObjectId($qb, $objectId); - $this->limitToType($qb, $type); - $this->limitToAttributedTo($qb, $actor->getId()); - - $cursor = $qb->execute(); - $data = $cursor->fetch(); - $cursor->closeCursor(); - - if ($data === false) { - throw new NoteNotFoundException( - 'StreamByObjectId not found - ' . $actor->getId() . ' - ' . $type . ' - ' - . $objectId - ); - } - - return $this->parseNotesSelectSql($data); - } - - - /** - * @param string $actorId - * - * @return int - */ - public function countNotesFromActorId(string $actorId): int { - $qb = $this->countNotesSelectSql(); - $this->limitToAttributedTo($qb, $actorId); - $this->limitToType($qb, Note::TYPE); - - $cursor = $qb->execute(); - $data = $cursor->fetch(); - $cursor->closeCursor(); - - return $this->getInt('count', $data, 0); - } - - - /** - * Should returns: - * * Own posts, - * * Followed accounts - * - * @param Person $actor - * @param int $since - * @param int $limit - * - * @return Stream[] - * @throws Exception - */ - public function getStreamHome(Person $actor, int $since = 0, int $limit = 5): array { - $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); - - $notes = []; - $cursor = $qb->execute(); - while ($data = $cursor->fetch()) { - try { - $notes[] = $this->parseNotesSelectSql($data); - } catch (Exception $e) { - } - } - $cursor->closeCursor(); - - return $notes; - } - - - /** - * Should returns: - * * Public/Unlisted/Followers-only post where current $actor is tagged, - * - Events: (not yet) - * - people liking or re-posting your posts (not yet) - * - someone wants to follow you (not yet) - * - someone is following you (not yet) - * - * @param Person $actor - * @param int $since - * @param int $limit - * - * @return array - * @throws Exception - */ - public function getStreamNotifications(Person $actor, int $since = 0, int $limit = 5): array { - $qb = $this->getNotesSelectSql(); - - $this->limitPaginate($qb, $since, $limit); - $this->limitToRecipient($qb, $actor->getId(), false); - $this->leftJoinCacheActors($qb, 'attributed_to'); - $this->leftJoinStreamAction($qb); - - $notes = []; - $cursor = $qb->execute(); - while ($data = $cursor->fetch()) { - try { - $notes[] = $this->parseNotesSelectSql($data); - } catch (Exception $e) { - } - } - $cursor->closeCursor(); - - return $notes; - } - - - /** - * Should returns: - * * public message from actorId. - * - to followers-only if follower is logged. (not yet (check ?)) - * - * @param string $actorId - * @param int $since - * @param int $limit - * - * @return array - * @throws Exception - */ - 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); - $this->leftJoinStreamAction($qb); - - $notes = []; - $cursor = $qb->execute(); - while ($data = $cursor->fetch()) { - try { - $notes[] = $this->parseNotesSelectSql($data); - } catch (Exception $e) { - } - } - $cursor->closeCursor(); - - return $notes; - } - - - /** - * Should returns: - * * Private message. - * - group messages. (not yet) - * - * @param Person $actor - * @param int $since - * @param int $limit - * - * @return array - * @throws Exception - */ - public function getStreamDirect(Person $actor, int $since = 0, int $limit = 5): array { - $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()); - - $this->leftJoinCacheActors($qb, 'attributed_to'); - - $notes = []; - $cursor = $qb->execute(); - while ($data = $cursor->fetch()) { - try { - $notes[] = $this->parseNotesSelectSql($data); - } catch (Exception $e) { - } - } - $cursor->closeCursor(); - - return $notes; - } - - - /** - * Should returns: - * * All local public/federated posts - * - * @param int $since - * @param int $limit - * @param bool $localOnly - * - * @return array - * @throws Exception - */ - public function getStreamTimeline(int $since = 0, int $limit = 5, bool $localOnly = true - ): array { - $qb = $this->getNotesSelectSql(); - $this->limitPaginate($qb, $since, $limit); -// $this->limitToType($qb, Note::TYPE); - - if ($localOnly) { - $this->limitToLocal($qb, true); - } - - $this->leftJoinCacheActors($qb, 'attributed_to'); - $this->leftJoinStreamAction($qb); - - // TODO: to: = real public, cc: = unlisted !? - $this->limitToRecipient($qb, ACore::CONTEXT_PUBLIC, true, ['to']); - - $notes = []; - $cursor = $qb->execute(); - while ($data = $cursor->fetch()) { - try { - $notes[] = $this->parseNotesSelectSql($data); - } catch (Exception $e) { - } - } - $cursor->closeCursor(); - - return $notes; - } - - - /** - * Should returns: - * - All public post related to a tag (not yet) - * - direct message related to a tag (not yet) - * - message to followers related to a tag (not yet) - * - * @param Person $actor - * @param string $hashtag - * @param int $since - * @param int $limit - * - * @return array - * @throws Exception - */ - public function getStreamTag(Person $actor, string $hashtag, int $since = 0, int $limit = 5 - ): array { - $qb = $this->getNotesSelectSql(); - - $on = $this->exprJoinFollowing($qb, $actor); - $on->add($this->exprLimitToRecipient($qb, ACore::CONTEXT_PUBLIC, false)); - $on->add($this->exprLimitToRecipient($qb, $actor->getId(), true)); - $qb->join($this->defaultSelectAlias, CoreRequestBuilder::TABLE_FOLLOWS, 'f', $on); - - $qb->andWhere($this->exprValueWithinJsonFormat($qb, 'hashtags', '' . $hashtag)); - - $this->limitPaginate($qb, $since, $limit); - $this->leftJoinCacheActors($qb, 'attributed_to'); - $this->leftJoinStreamAction($qb); - - $notes = []; - $cursor = $qb->execute(); - while ($data = $cursor->fetch()) { - $notes[] = $this->parseNotesSelectSql($data); - } - $cursor->closeCursor(); - - return $notes; - } - - - /** - * @param int $since - * - * @return Note[] - * @throws Exception - */ - public function getNotesSince(int $since): array { - $qb = $this->getNotesSelectSql(); - $this->limitToSince($qb, $since, 'published_time'); - $this->leftJoinStreamAction($qb); - - $notes = []; - $cursor = $qb->execute(); - while ($data = $cursor->fetch()) { - $notes[] = $this->parseNotesSelectSql($data); - } - $cursor->closeCursor(); - - return $notes; - } - - - /** - * @param string $id - * @param string $type - */ - public function deleteNoteById(string $id, string $type = '') { - $qb = $this->getNotesDeleteSql(); - - $this->limitToIdString($qb, $id); - if ($type !== '') { - $this->limitToType($qb, $type); - } - - $qb->execute(); - } - - - /** - * @param string $actorId - */ - public function deleteByAuthor(string $actorId) { - $qb = $this->getNotesDeleteSql(); - $this->limitToAttributedTo($qb, $actorId); - - $qb->execute(); - } - - - /** - * Insert a new Note in the database. - * - * @param Stream $note - * - * @return IQueryBuilder - */ - public function saveStream(Stream $note): IQueryBuilder { - - try { - $dTime = new DateTime(); - $dTime->setTimestamp($note->getPublishedTime()); - } catch (Exception $e) { - } - - $cache = '[]'; - if ($note->gotCache()) { - $cache = json_encode($note->getCache(), JSON_UNESCAPED_SLASHES); - } - - $attributedTo = $note->getAttributedTo(); - if ($attributedTo === '' && $note->isLocal()) { - $attributedTo = $note->getActor() - ->getId(); - } - - $qb = $this->getNotesInsertSql(); - $qb->setValue('id', $qb->createNamedParameter($note->getId())) - ->setValue('type', $qb->createNamedParameter($note->getType())) - ->setValue('to', $qb->createNamedParameter($note->getTo())) - ->setValue( - 'to_array', $qb->createNamedParameter( - json_encode($note->getToArray(), JSON_UNESCAPED_SLASHES) - ) - ) - ->setValue( - 'cc', $qb->createNamedParameter( - json_encode($note->getCcArray(), JSON_UNESCAPED_SLASHES) - ) - ) - ->setValue( - 'bcc', $qb->createNamedParameter( - json_encode($note->getBccArray()), JSON_UNESCAPED_SLASHES - ) - ) - ->setValue('content', $qb->createNamedParameter($note->getContent())) - ->setValue('summary', $qb->createNamedParameter($note->getSummary())) - ->setValue('published', $qb->createNamedParameter($note->getPublished())) - ->setValue('attributed_to', $qb->createNamedParameter($attributedTo)) - ->setValue('in_reply_to', $qb->createNamedParameter($note->getInReplyTo())) - ->setValue('source', $qb->createNamedParameter($note->getSource())) - ->setValue('object_id', $qb->createNamedParameter($note->getObjectId())) - ->setValue('cache', $qb->createNamedParameter($cache)) - ->setValue( - 'instances', $qb->createNamedParameter( - json_encode($note->getInstancePaths(), JSON_UNESCAPED_SLASHES) - ) - ) - ->setValue('local', $qb->createNamedParameter(($note->isLocal()) ? '1' : '0')); - - try { - $dTime = new DateTime(); - $dTime->setTimestamp($note->getPublishedTime()); - $qb->setValue( - 'published_time', $qb->createNamedParameter($dTime, IQueryBuilder::PARAM_DATE) - ) - ->setValue( - 'creation', - $qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE) - ); - } catch (Exception $e) { - } - - $this->generatePrimaryKey($qb, $note->getId()); - - return $qb; - } - -} - |