Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
pull/374/head
Maxence Lange 2019-02-22 23:04:00 -01:00
rodzic 8a92d5680a
commit 9ac8eb965b
17 zmienionych plików z 426 dodań i 202 usunięć

Wyświetl plik

@ -47,6 +47,7 @@
<commands>
<command>OCA\Social\Command\CacheRefresh</command>
<command>OCA\Social\Command\NoteCreate</command>
<command>OCA\Social\Command\NoteBoost</command>
<command>OCA\Social\Command\Reset</command>
<command>OCA\Social\Command\QueueStatus</command>
<command>OCA\Social\Command\QueueProcess</command>

Wyświetl plik

@ -0,0 +1,136 @@
<?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\Command;
use Exception;
use OC\Core\Command\Base;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Object\Announce;
use OCA\Social\Model\ActivityPub\Stream;
use OCA\Social\Model\Post;
use OCA\Social\Service\AccountService;
use OCA\Social\Service\ActivityService;
use OCA\Social\Service\ConfigService;
use OCA\Social\Service\CurlService;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\NoteService;
use OCA\Social\Service\PostService;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class NoteBoost extends Base {
/** @var ConfigService */
private $configService;
/** @var ActivityService */
private $activityService;
/** @var NoteService */
private $noteService;
/** @var AccountService */
private $accountService;
/** @var PostService */
private $postService;
/** @var CurlService */
private $curlService;
/** @var MiscService */
private $miscService;
/**
* NoteCreate constructor.
*
* @param ActivityService $activityService
* @param AccountService $accountService
* @param NoteService $noteService
* @param PostService $postService
* @param CurlService $curlService
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
ActivityService $activityService, AccountService $accountService,
NoteService $noteService, PostService $postService, CurlService $curlService,
ConfigService $configService, MiscService $miscService
) {
parent::__construct();
$this->activityService = $activityService;
$this->noteService = $noteService;
$this->accountService = $accountService;
$this->postService = $postService;
$this->curlService = $curlService;
$this->configService = $configService;
$this->miscService = $miscService;
}
/**
*
*/
protected function configure() {
parent::configure();
$this->setName('social:note:boost')
->addArgument('userid', InputArgument::REQUIRED, 'userId of the author')
->addArgument('note', InputArgument::REQUIRED, 'Note to boost')
->setDescription('Boost a note');
}
/**
* @param InputInterface $input
* @param OutputInterface $output
*
* @throws Exception
*/
protected function execute(InputInterface $input, OutputInterface $output) {
$userId = $input->getArgument('userid');
$noteId = $input->getArgument('note');
$actor = $this->accountService->getActorFromUserId($userId);
$this->noteService->setViewer($actor);
$token = $this->noteService->createBoost($actor, $noteId, $activity);
echo 'object: ' . json_encode($activity, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES) . "\n";
echo 'token: ' . $token . "\n";
}
}

Wyświetl plik

@ -47,6 +47,7 @@ use Symfony\Component\Console\Output\OutputInterface;
class NoteCreate extends Base {
/** @var ConfigService */
private $configService;

Wyświetl plik

@ -38,7 +38,6 @@ use OCA\Social\Exceptions\AccountDoesNotExistException;
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\Model\Post;
use OCA\Social\Service\AccountService;
@ -198,6 +197,35 @@ class LocalController extends Controller {
/**
* Create a new boost.
*
* @NoAdminRequired
*
* @param array $data
*
* @return DataResponse
*/
public function boostPost(array $data): DataResponse {
try {
$this->initViewer(true);
$postId = $this->get('postId', $data, '');
$token = $this->noteService->createBoost($this->viewer, $postId, $announce);
return $this->success(
[
'boost' => $announce,
'token' => $token
]
);
} catch (Exception $e) {
return $this->fail($e);
}
}
/**
* @NoCSRFRequired
* @NoAdminRequired
*
* @param int $since
@ -669,13 +697,19 @@ class LocalController extends Controller {
*/
private function initViewer(bool $exception = false) {
if (!isset($this->userId)) {
if ($exception) {
throw new AccountDoesNotExistException('userId not defined');
}
return;
}
try {
$this->viewer = $this->accountService->getActorFromUserId($this->userId, true);
$this->followService->setViewerId($this->viewer->getId());
$this->cacheActorService->setViewerId($this->viewer->getId());
$this->noteService->setViewer($this->viewer);
$this->followService->setViewer($this->viewer);
$this->cacheActorService->setViewer($this->viewer);
} catch (Exception $e) {
if ($exception) {
throw new AccountDoesNotExistException();

Wyświetl plik

@ -79,8 +79,8 @@ class CoreRequestBuilder {
/** @var string */
protected $defaultSelectAlias;
/** @var string */
private $viewerId = '';
/** @var Person */
protected $viewer = null;
/**
@ -100,17 +100,10 @@ class CoreRequestBuilder {
/**
* @return string
* @param Person $viewer
*/
public function getViewerId(): string {
return $this->viewerId;
}
/**
* @param string $viewerId
*/
public function setViewerId(string $viewerId) {
$this->viewerId = $viewerId;
public function setViewer(Person $viewer) {
$this->viewer = $viewer;
}
@ -722,8 +715,7 @@ class CoreRequestBuilder {
return;
}
$viewerId = $this->getViewerId();
if ($viewerId === '') {
if ($this->viewer === null) {
return;
}
@ -744,7 +736,7 @@ class CoreRequestBuilder {
$andX->add(
$expr->eq(
$func->lower($prefix . '_f.actor_id'),
$func->lower($qb->createNamedParameter($viewerId))
$func->lower($qb->createNamedParameter($this->viewer->getId()))
)
);
} else {
@ -756,7 +748,7 @@ class CoreRequestBuilder {
$andX->add(
$expr->eq(
$func->lower($prefix . '_f.object_id'),
$func->lower($qb->createNamedParameter($viewerId))
$func->lower($qb->createNamedParameter($this->viewer->getId()))
)
);
}
@ -820,24 +812,25 @@ class CoreRequestBuilder {
* @param array $data
*/
protected function assignDetails(Person $actor, array $data) {
if ($this->getViewerId() !== '') {
try {
$this->parseFollowLeftJoin($data, 'as_follower');
$actor->addDetailBool('following', true);
} catch (InvalidResourceException $e) {
$actor->addDetailBool('following', false);
}
try {
$this->parseFollowLeftJoin($data, 'as_followed');
$actor->addDetailBool('followed', true);
} catch (InvalidResourceException $e) {
$actor->addDetailBool('followed', false);
}
$actor->setCompleteDetails(true);
if ($this->viewer === null) {
return;
}
try {
$this->parseFollowLeftJoin($data, 'as_follower');
$actor->addDetailBool('following', true);
} catch (InvalidResourceException $e) {
$actor->addDetailBool('following', false);
}
try {
$this->parseFollowLeftJoin($data, 'as_followed');
$actor->addDetailBool('followed', true);
} catch (InvalidResourceException $e) {
$actor->addDetailBool('followed', false);
}
$actor->setCompleteDetails(true);
}

Wyświetl plik

@ -60,61 +60,18 @@ class NotesRequest extends NotesRequestBuilder {
/**
* Insert a new Note in the database.
*
* @param Stream $note
* @param Stream $stream
*/
public function save(Stream $note) {
$dTime = new DateTime();
$dTime->setTimestamp($note->getPublishedTime());
public function save(Stream $stream) {
$qb = $this->saveStream($stream);
$cache = '[]';
if ($note->gotCache()) {
$cache = json_encode($note->getCache(), JSON_UNESCAPED_SLASHES);
if ($stream->getType() === Note::TYPE) {
/** @var Note $stream */
$qb->setValue(
'hashtags', $qb->createNamedParameter(json_encode($stream->getHashtags()))
);
}
$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('hashtags', $qb->createNamedParameter(json_encode($note->getHashtags())))
->setValue('published', $qb->createNamedParameter($note->getPublished()))
->setValue(
'published_time', $qb->createNamedParameter($dTime, IQueryBuilder::PARAM_DATE)
)
->setValue('attributed_to', $qb->createNamedParameter($note->getAttributedTo()))
->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'))
->setValue(
'creation',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
);
$qb->execute();
}
@ -135,11 +92,12 @@ class NotesRequest extends NotesRequestBuilder {
/**
* @param string $id
* @param bool $asViewer
*
* @return Note
* @throws NoteNotFoundException
*/
public function getNoteById(string $id): Note {
public function getNoteById(string $id, bool $asViewer = false): Note {
if ($id === '') {
throw new NoteNotFoundException();
};
@ -147,6 +105,10 @@ class NotesRequest extends NotesRequestBuilder {
$qb = $this->getNotesSelectSql();
$this->limitToIdString($qb, $id);
if ($asViewer) {
$this->limitToViewer($qb);
}
$cursor = $qb->execute();
$data = $cursor->fetch();
$cursor->closeCursor();
@ -435,5 +397,66 @@ class NotesRequest extends NotesRequestBuilder {
$qb->execute();
}
/**
* Insert a new Note in the database.
*
* @param Stream $note
*
* @return IQueryBuilder
*/
public function saveStream(Stream $note): IQueryBuilder {
$dTime = new DateTime();
$dTime->setTimestamp($note->getPublishedTime());
$cache = '[]';
if ($note->gotCache()) {
$cache = json_encode($note->getCache(), JSON_UNESCAPED_SLASHES);
}
$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(
'published_time', $qb->createNamedParameter($dTime, IQueryBuilder::PARAM_DATE)
)
->setValue('attributed_to', $qb->createNamedParameter($note->getAttributedTo()))
->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'))
->setValue(
'creation',
$qb->createNamedParameter(new DateTime('now'), IQueryBuilder::PARAM_DATE)
);
return $qb;
}
}

Wyświetl plik

@ -33,6 +33,7 @@ namespace OCA\Social\Db;
use daita\MySmallPhpTools\Traits\TArrayTools;
use Doctrine\DBAL\Query\QueryBuilder;
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\InstancePath;
@ -83,10 +84,10 @@ class NotesRequestBuilder extends CoreRequestBuilder {
$qb->selectDistinct('sn.id')
->addSelect(
'sn.type', 'sn.to', 'sn.to_array', 'sn.cc', 'sn.bcc', 'sn.content',
'sn.summary', 'sn.published', 'sn.published_time', 'sn.cache', 'sn.object_id',
'sn.attributed_to', 'sn.in_reply_to', 'sn.source', 'sn.local', 'sn.instances',
'sn.creation'
)
'sn.summary', 'sn.published', 'sn.published_time', 'sn.cache', 'sn.object_id',
'sn.attributed_to', 'sn.in_reply_to', 'sn.source', 'sn.local', 'sn.instances',
'sn.creation'
)
->from(self::TABLE_SERVER_NOTES, 'sn');
$this->defaultSelectAlias = 'sn';
@ -124,6 +125,19 @@ class NotesRequestBuilder extends CoreRequestBuilder {
}
/**
* @param IQueryBuilder $qb
*/
protected function limitToViewer(IQueryBuilder $qb) {
$actor = $this->viewer;
$on = $this->exprJoinFollowing($qb, $actor, false);
$on->add($this->exprLimitToRecipient($qb, ACore::CONTEXT_PUBLIC, false));
$on->add($this->exprLimitToRecipient($qb, $actor->getId(), true));
$qb->join($this->defaultSelectAlias, CoreRequestBuilder::TABLE_SERVER_FOLLOWS, 'f', $on);
}
/**
* @param IQueryBuilder $qb
* @param Person $actor
@ -143,15 +157,19 @@ class NotesRequestBuilder extends CoreRequestBuilder {
* @param IQueryBuilder $qb
* @param Person $actor
*
* @param bool $followers
*
* @return ICompositeExpression
*/
protected function exprJoinFollowing(IQueryBuilder $qb, Person $actor) {
protected function exprJoinFollowing(IQueryBuilder $qb, Person $actor, bool $followers = true) {
$expr = $qb->expr();
$func = $qb->func();
$pf = $this->defaultSelectAlias . '.';
$on = $expr->orX();
$on->add($this->exprLimitToRecipient($qb, $actor->getFollowers(), false));
if ($followers) {
$on->add($this->exprLimitToRecipient($qb, $actor->getFollowers(), false));
}
// list of possible recipient as a follower (to, to_array, cc, ...)
$recipientFields = $expr->orX();

Wyświetl plik

@ -669,7 +669,10 @@ class ACore extends Item implements JsonSerializable {
$this->addEntryBool('local', $this->isLocal());
}
return $this->getEntries();
$result = $this->getEntries();
$this->cleanArray($result);
return $result;
}
}

Wyświetl plik

@ -64,8 +64,6 @@ class Announce extends Stream implements JsonSerializable {
*/
public function import(array $data) {
parent::import($data);
$this->setAttributedTo($this->getActorId());
}

Wyświetl plik

@ -107,7 +107,7 @@ class Note extends Stream implements JsonSerializable {
public function importFromDatabase(array $data) {
parent::importFromDatabase($data);
$this->setHashtags($this->getArray('hashtags', $data, []));
$this->setHashtags($this->getArray('hashtags', $data, []));
}
@ -117,10 +117,12 @@ class Note extends Stream implements JsonSerializable {
public function jsonSerialize(): array {
$result = parent::jsonSerialize();
if ($this->isCompleteDetails()) {
if ($this->isCompleteDetails()) {
$result['hashtags'] = $this->getHashtags();
}
$this->cleanArray($result);
return $result;
}

Wyświetl plik

@ -293,13 +293,13 @@ class Stream extends ACore implements JsonSerializable {
* @return array
*/
public function jsonSerialize(): array {
$this->addEntryInt('publishedTime', $this->getPublishedTime());
$result = array_merge(
parent::jsonSerialize(),
[
'content' => $this->getContent(),
'attributedTo' => $this->getUrlSocial() . $this->getAttributedTo(),
'attributedTo' => ($this->getAttributedTo() !== '') ? $this->getUrlSocial()
. $this->getAttributedTo(
) : '',
'inReplyTo' => $this->getInReplyTo(),
'sensitive' => $this->isSensitive(),
'conversation' => $this->getConversation()
@ -310,11 +310,14 @@ class Stream extends ACore implements JsonSerializable {
$result = array_merge(
$result,
[
'cache' => $this->getCache()
'cache' => ($this->gotCache()) ? $this->getCache() : '',
'publishedTime' => $this->getPublishedTime()
]
);
}
$this->cleanArray($result);
return $result;
}

Wyświetl plik

@ -293,12 +293,7 @@ class LinkedDataSignature implements JsonSerializable {
*/
private function hashedCanonicalize(array $data, bool $removeEmptyValue = false): string {
if ($removeEmptyValue) {
$data = array_filter(
$data,
function($v) {
return ($v !== '');
}
);
$this->cleanArray($data);
}
$object = json_decode(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE));

Wyświetl plik

@ -65,10 +65,6 @@ class ActorService {
private $miscService;
/** @var string */
private $viewerId = '';
/**
* ActorService constructor.
*
@ -92,19 +88,6 @@ class ActorService {
}
/**
* @param string $viewerId
*/
public function setViewerId(string $viewerId) {
$this->viewerId = $viewerId;
$this->cacheActorsRequest->setViewerId($viewerId);
}
public function getViewerId(): string {
return $this->viewerId;
}
/**
* @param Person $actor
*/

Wyświetl plik

@ -69,8 +69,8 @@ class CacheActorService {
private $miscService;
/** @var string */
private $viewerId;
/** @var Person */
private $viewer = null;
/**
@ -93,15 +93,11 @@ class CacheActorService {
/**
* @param string $viewerId
* @param Person $viewer
*/
public function setViewerId(string $viewerId) {
$this->viewerId = $viewerId;
$this->cacheActorsRequest->setViewerId($viewerId);
}
public function getViewerId(): string {
return $this->viewerId;
public function setViewer(Person $viewer) {
$this->viewer = $viewer;
$this->cacheActorsRequest->setViewer($viewer);
}
@ -171,6 +167,7 @@ class CacheActorService {
if (strrpos($account, '@')) {
$account = substr($account, 0, strrpos($account, '@'));
}
return $this->cacheActorsRequest->getFromLocalAccount($account);
}

Wyświetl plik

@ -77,8 +77,8 @@ class FollowService {
private $miscService;
/** @var string */
private $viewerId = '';
/** @var Person */
private $viewer = null;
/**
@ -104,15 +104,11 @@ class FollowService {
/**
* @param string $viewerId
* @param Person $viewer
*/
public function setViewerId(string $viewerId) {
$this->viewerId = $viewerId;
$this->followsRequest->setViewerId($viewerId);
}
public function getViewerId(): string {
return $this->viewerId;
public function setViewer(Person $viewer) {
$this->viewer = $viewer;
$this->followsRequest->setViewer($viewer);
}

Wyświetl plik

@ -46,7 +46,9 @@ use OCA\Social\Exceptions\RequestServerException;
use OCA\Social\Exceptions\SocialAppConfigException;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Actor\Person;
use OCA\Social\Model\ActivityPub\Object\Announce;
use OCA\Social\Model\ActivityPub\Object\Note;
use OCA\Social\Model\ActivityPub\Stream;
use OCA\Social\Model\InstancePath;
class NoteService {
@ -61,6 +63,9 @@ class NoteService {
/** @var AccountService */
private $accountService;
/** @var SignatureService */
private $signatureService;
/** @var CacheActorService */
private $cacheActorService;
@ -71,8 +76,8 @@ class NoteService {
private $miscService;
/** @var string */
private $viewerId = '';
/** @var Person */
private $viewer = null;
/**
@ -81,18 +86,20 @@ class NoteService {
* @param NotesRequest $notesRequest
* @param ActivityService $activityService
* @param AccountService $accountService
* @param SignatureService $signatureService
* @param CacheActorService $cacheActorService
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
NotesRequest $notesRequest, ActivityService $activityService,
AccountService $accountService, CacheActorService $cacheActorService,
ConfigService $configService, MiscService $miscService
AccountService $accountService, SignatureService $signatureService,
CacheActorService $cacheActorService, ConfigService $configService, MiscService $miscService
) {
$this->notesRequest = $notesRequest;
$this->activityService = $activityService;
$this->accountService = $accountService;
$this->signatureService = $signatureService;
$this->cacheActorService = $cacheActorService;
$this->configService = $configService;
$this->miscService = $miscService;
@ -100,65 +107,84 @@ class NoteService {
/**
* @param string $viewerId
* @param Person $viewer
*/
public function setViewerId(string $viewerId) {
$this->viewerId = $viewerId;
$this->notesRequest->setViewerId($viewerId);
}
public function getViewerId(): string {
return $this->viewerId;
public function setViewer(Person $viewer) {
$this->viewer = $viewer;
$this->notesRequest->setViewer($viewer);
}
/**
* @param Person $actor
* @param string $content
* @param string $postId
* @param ACore|null $announce
*
* @param string $type
*
* @return Note
* @return string
* @throws NoteNotFoundException
* @throws SocialAppConfigException
*/
public function generateNote(Person $actor, string $content, string $type) {
$note = new Note();
$note->setId($this->configService->generateId('@' . $actor->getPreferredUsername()));
$note->setPublished(date("c"));
$note->setAttributedTo(
$this->configService->getUrlSocial() . '@' . $actor->getPreferredUsername()
);
public function createBoost(Person $actor, string $postId, ACore &$announce = null): string {
$this->setRecipient($note, $actor, $type);
$note->setContent($content);
$note->convertPublished();
$note->setLocal(true);
$announce = new Announce();
$this->assignStream($announce, $actor, Stream::TYPE_PUBLIC);
return $note;
$announce->setActor($actor);
$note = $this->getNoteById($postId, true);
$announce->addCc($note->getAttributedTo());
if ($note->isLocal()) {
$announce->setObject($note);
} else {
$announce->setObjectId($note->getId());
}
$this->signatureService->signObject($actor, $announce);
$this->notesRequest->save($announce);
$token = $this->activityService->request($announce);
return $token;
}
/**
* @param Note $note
* @param Stream $stream
* @param Person $actor
* @param string $type
*
* @throws SocialAppConfigException
*/
public function assignStream(Stream &$stream, Person $actor, string $type) {
$stream->setId($this->configService->generateId('@' . $actor->getPreferredUsername()));
$stream->setPublished(date("c"));
$this->setRecipient($stream, $actor, $type);
$stream->convertPublished();
$stream->setLocal(true);
}
/**
* @param Stream $stream
* @param Person $actor
* @param string $type
*/
private function setRecipient(Note $note, Person $actor, string $type) {
private function setRecipient(Stream $stream, Person $actor, string $type) {
switch ($type) {
case Note::TYPE_UNLISTED:
$note->setTo($actor->getFollowers());
$note->addInstancePath(
$stream->setTo($actor->getFollowers());
$stream->addInstancePath(
new InstancePath(
$actor->getFollowers(), InstancePath::TYPE_FOLLOWERS,
InstancePath::PRIORITY_LOW
)
);
$note->addCc(ACore::CONTEXT_PUBLIC);
$stream->addCc(ACore::CONTEXT_PUBLIC);
break;
case Note::TYPE_FOLLOWERS:
$note->setTo($actor->getFollowers());
$note->addInstancePath(
$stream->setTo($actor->getFollowers());
$stream->addInstancePath(
new InstancePath(
$actor->getFollowers(), InstancePath::TYPE_FOLLOWERS,
InstancePath::PRIORITY_LOW
@ -170,9 +196,9 @@ class NoteService {
break;
default:
$note->setTo(ACore::CONTEXT_PUBLIC);
$note->addCc($actor->getFollowers());
$note->addInstancePath(
$stream->setTo(ACore::CONTEXT_PUBLIC);
$stream->addCc($actor->getFollowers());
$stream->addInstancePath(
new InstancePath(
$actor->getFollowers(), InstancePath::TYPE_FOLLOWERS,
InstancePath::PRIORITY_LOW
@ -184,11 +210,11 @@ class NoteService {
/**
* @param Note $note
* @param Stream $stream
* @param string $type
* @param string $account
*/
public function addRecipient(Note $note, string $type, string $account) {
public function addRecipient(Stream $stream, string $type, string $account) {
if ($account === '') {
return;
}
@ -204,12 +230,12 @@ class NoteService {
);
if ($type === Note::TYPE_DIRECT) {
$instancePath->setPriority(InstancePath::PRIORITY_HIGH);
$note->addToArray($actor->getId());
$stream->addToArray($actor->getId());
} else {
$note->addCc($actor->getId());
$stream->addCc($actor->getId());
}
$note->addTag(
$stream->addTag(
[
'type' => 'Mention',
'href' => $actor->getId(),
@ -217,7 +243,7 @@ class NoteService {
]
);
$note->addInstancePath($instancePath);
$stream->addInstancePath($instancePath);
}
@ -242,13 +268,13 @@ class NoteService {
/**
* @param Note $note
* @param Stream $stream
* @param string $type
* @param array $accounts
*/
public function addRecipients(Note $note, string $type, array $accounts) {
public function addRecipients(Stream $stream, string $type, array $accounts) {
foreach ($accounts as $account) {
$this->addRecipient($note, $type, $account);
$this->addRecipient($stream, $type, $account);
}
}
@ -316,12 +342,13 @@ class NoteService {
/**
* @param string $id
* @param bool $asViewer
*
* @return Note
* @throws NoteNotFoundException
*/
public function getNoteById(string $id): Note {
return $this->notesRequest->getNoteById($id);
public function getNoteById(string $id, bool $asViewer = false): Note {
return $this->notesRequest->getNoteById($id, $asViewer);
}
@ -392,7 +419,8 @@ class NoteService {
*
* @return Note[]
*/
public function getStreamLocalTag(Person $actor, string $hashtag, int $since = 0, int $limit = 5): array {
public function getStreamLocalTag(Person $actor, string $hashtag, int $since = 0, int $limit = 5
): array {
return $this->notesRequest->getStreamTag($actor, $hashtag, $since, $limit);
}
@ -409,7 +437,8 @@ class NoteService {
}
/**
/**m
*
* @param int $since
* @param int $limit
*
@ -443,5 +472,6 @@ class NoteService {
return $this->cacheActorService->getFromId($note->getAttributedTo());
}
}

Wyświetl plik

@ -38,10 +38,12 @@ use OCA\Social\Exceptions\NoteNotFoundException;
use OCA\Social\Exceptions\RedundancyLimitException;
use OCA\Social\Exceptions\RequestContentException;
use OCA\Social\Exceptions\RequestNetworkException;
use OCA\Social\Exceptions\RequestResultNotJsonException;
use OCA\Social\Exceptions\RequestResultSizeException;
use OCA\Social\Exceptions\RequestServerException;
use OCA\Social\Exceptions\SocialAppConfigException;
use OCA\Social\Model\ActivityPub\ACore;
use OCA\Social\Model\ActivityPub\Object\Note;
use OCA\Social\Model\Post;
class PostService {
@ -56,6 +58,9 @@ class PostService {
/** @var ActivityService */
private $activityService;
/** @var ConfigService */
private $configService;
/** @var MiscService */
private $miscService;
@ -66,15 +71,17 @@ class PostService {
* @param NoteService $noteService
* @param AccountService $accountService
* @param ActivityService $activityService
* @param ConfigService $configService
* @param MiscService $miscService
*/
public function __construct(
NoteService $noteService, AccountService $accountService, ActivityService $activityService,
MiscService $miscService
ConfigService $configService, MiscService $miscService
) {
$this->noteService = $noteService;
$this->accountService = $accountService;
$this->activityService = $activityService;
$this->configService = $configService;
$this->miscService = $miscService;
}
@ -95,12 +102,16 @@ class PostService {
* @throws RequestResultSizeException
* @throws RequestServerException
* @throws MalformedArrayException
* @throws RequestResultNotJsonException
*/
public function createPost(Post $post, ACore &$activity = null): string {
$note =
$this->noteService->generateNote(
$post->getActor(), htmlentities($post->getContent(), ENT_QUOTES), $post->getType()
);
$note = new Note();
$this->noteService->assignStream($note, $post->getActor(), $post->getType());
$note->setAttributedTo(
$this->configService->getUrlSocial() . '@' . $actor->getPreferredUsername()
);
$note->setContent(htmlentities($post->getContent(), ENT_QUOTES));
$this->noteService->replyTo($note, $post->getReplyTo());
$this->noteService->addRecipients($note, $post->getType(), $post->getTo());