kopia lustrzana https://github.com/nextcloud/social
favourites and notifications
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>pull/1543/head
rodzic
f5d8e4d1a6
commit
0ebc496d81
|
@ -79,8 +79,9 @@ return [
|
|||
['name' => 'Api#instance', 'url' => '/api/v1/instance/', 'verb' => 'GET'],
|
||||
['name' => 'Api#customEmojis', 'url' => '/api/v1/custom_emojis', 'verb' => 'GET'],
|
||||
['name' => 'Api#savedSearches', 'url' => '/api/saved_searches/list.json', 'verb' => 'GET'],
|
||||
['name' => 'Api#timelines', 'url' => '/api/v1/timelines/{timeline}/', 'verb' => 'GET'],
|
||||
['name' => 'Api#favourites', 'url' => '/api/v1/favourites/', 'verb' => 'GET'],
|
||||
['name' => 'Api#notifications', 'url' => '/api/v1/notifications', 'verb' => 'GET'],
|
||||
['name' => 'Api#tag', 'url' => '/api/v1/timelines/tag/{hashtag}', 'verb' => 'GET'],
|
||||
['name' => 'Api#statusNew', 'url' => '/api/v1/statuses', 'verb' => 'POST'],
|
||||
|
||||
// Api for local front-end
|
||||
|
|
|
@ -31,11 +31,8 @@ declare(strict_types=1);
|
|||
|
||||
namespace OCA\Social\AppInfo;
|
||||
|
||||
use Closure;
|
||||
use OCA\Social\Notification\Notifier;
|
||||
use OCA\Social\Search\UnifiedSearchProvider;
|
||||
use OCA\Social\Service\ConfigService;
|
||||
use OCA\Social\Service\UpdateService;
|
||||
use OCA\Social\WellKnown\WebfingerHandler;
|
||||
use OCA\Social\Listeners\ProfileSectionListener;
|
||||
use OCA\Social\Dashboard\SocialWidget;
|
||||
|
@ -43,13 +40,7 @@ use OCP\AppFramework\App;
|
|||
use OCP\AppFramework\Bootstrap\IBootContext;
|
||||
use OCP\AppFramework\Bootstrap\IBootstrap;
|
||||
use OCP\AppFramework\Bootstrap\IRegistrationContext;
|
||||
use OCP\AppFramework\QueryException;
|
||||
use OCP\Profile\BeforeTemplateRenderedEvent;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IServerContainer;
|
||||
use OC\DB\SchemaWrapper;
|
||||
use OCP\DB\ISchemaWrapper;
|
||||
use Throwable;
|
||||
|
||||
require_once __DIR__ . '/../../vendor/autoload.php';
|
||||
|
||||
|
|
|
@ -62,6 +62,7 @@ class ExtendedBase extends Base {
|
|||
protected function outputStreams(array $streams) {
|
||||
if ($this->asJson) {
|
||||
$this->output->writeln(json_encode($streams, JSON_PRETTY_PRINT));
|
||||
return;
|
||||
}
|
||||
|
||||
$table = new Table($this->output);
|
||||
|
|
|
@ -33,12 +33,10 @@ namespace OCA\Social\Command;
|
|||
|
||||
use Exception;
|
||||
use OCA\Social\Db\StreamRequest;
|
||||
use OCA\Social\Exceptions\UnknownTimelineException;
|
||||
use OCA\Social\Model\ActivityPub\Stream;
|
||||
use OCA\Social\Model\Client\Options\TimelineOptions;
|
||||
use OCA\Social\Service\AccountService;
|
||||
use OCA\Social\Service\ConfigService;
|
||||
use OCA\Social\Tools\Exceptions\DateTimeException;
|
||||
use OCP\IUserManager;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
|
@ -88,15 +86,15 @@ class Timeline extends ExtendedBase {
|
|||
*/
|
||||
protected function configure() {
|
||||
parent::configure();
|
||||
$this->setName('social:stream')
|
||||
$this->setName('social:timeline')
|
||||
->addArgument('userId', InputArgument::REQUIRED, 'viewer')
|
||||
->addArgument('timeline', InputArgument::REQUIRED, 'timeline')
|
||||
->addOption('local', '', InputOption::VALUE_NONE, 'public')
|
||||
->addOption('count', '', InputOption::VALUE_REQUIRED, 'number of elements', '5')
|
||||
->addOption('min_id', '', InputOption::VALUE_REQUIRED, 'min_id', 0)
|
||||
->addOption('max_id', '', InputOption::VALUE_REQUIRED, 'max_id', 0)
|
||||
->addOption('since', '', InputOption::VALUE_REQUIRED, 'since', 0)
|
||||
->addOption('limit', '', InputOption::VALUE_REQUIRED, 'limit', 5)
|
||||
->addOption('crop', '', InputOption::VALUE_REQUIRED, 'crop', 0)
|
||||
->addOption('json', '', InputOption::VALUE_NONE, 'return JSON format')
|
||||
->setDescription('Get stream by timeline and viewer');
|
||||
}
|
||||
|
||||
|
@ -111,7 +109,7 @@ class Timeline extends ExtendedBase {
|
|||
$output = new ConsoleOutput();
|
||||
$this->output = $output->section();
|
||||
|
||||
$this->asJson = $input->getOption('json');
|
||||
$this->asJson = (strtolower($input->getOption('output')) === 'json');
|
||||
$this->crop = intval($input->getOption('crop'));
|
||||
|
||||
$userId = $input->getArgument('userId');
|
||||
|
@ -129,46 +127,17 @@ class Timeline extends ExtendedBase {
|
|||
|
||||
$options = new TimelineOptions();
|
||||
$options->setFormat(Stream::FORMAT_LOCAL);
|
||||
$options->setLimit(intval($input->getOption('count')))
|
||||
$options->setLimit(intval($input->getOption('limit')))
|
||||
->setMinId(intval($input->getOption('min_id')))
|
||||
->setMaxId(intval($input->getOption('max_id')));
|
||||
->setMaxId(intval($input->getOption('max_id')))
|
||||
->setSince(intval($input->getOption('since')));
|
||||
|
||||
try {
|
||||
if ($input->getOption('local')) {
|
||||
$options->setLocal(true);
|
||||
}
|
||||
$options->setTimeline($timeline = $input->getArgument('timeline'));
|
||||
$this->outputStreams($this->streamRequest->getTimeline($options));
|
||||
} catch (UnknownTimelineException $e) {
|
||||
$this->displayUnsupportedStream($options);
|
||||
if ($input->getOption('local')) {
|
||||
$options->setLocal(true);
|
||||
}
|
||||
$options->setTimeline($input->getArgument('timeline'));
|
||||
$this->outputStreams($this->streamRequest->getTimeline($options));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param TimelineOptions $options
|
||||
*
|
||||
* @throws DateTimeException
|
||||
*/
|
||||
private function displayUnsupportedStream(TimelineOptions $options) {
|
||||
switch ($options->getTimeline()) {
|
||||
case 'notifications':
|
||||
$stream = $this->streamRequest->getTimelineNotifications(0, $options->getLimit());
|
||||
$this->outputStreams($stream);
|
||||
break;
|
||||
|
||||
case 'liked':
|
||||
$stream = $this->streamRequest->getTimelineLiked(0, $options->getLimit());
|
||||
$this->outputStreams($stream);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Exception(
|
||||
'Unknown timeline. Try ' . implode(', ', TimelineOptions::$availableTimelines)
|
||||
. ', direct, notifications, liked'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -39,7 +39,6 @@ use OCA\Social\Exceptions\SignatureIsGoneException;
|
|||
use OCA\Social\Exceptions\SocialAppConfigException;
|
||||
use OCA\Social\Exceptions\StreamNotFoundException;
|
||||
use OCA\Social\Exceptions\UrlCloudException;
|
||||
use OCA\Social\Model\ActivityPub\Activity\Delete;
|
||||
use OCA\Social\Service\AccountService;
|
||||
use OCA\Social\Service\CacheActorService;
|
||||
use OCA\Social\Service\ConfigService;
|
||||
|
@ -76,6 +75,7 @@ class ActivityPubController extends Controller {
|
|||
private FollowService $followService;
|
||||
private StreamService $streamService;
|
||||
private ConfigService $configService;
|
||||
private LoggerInterface $logger;
|
||||
|
||||
public function __construct(
|
||||
IRequest $request,
|
||||
|
|
|
@ -193,23 +193,6 @@ class ApiController extends Controller {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* @NoCSRFRequired
|
||||
* @PublicPage
|
||||
*
|
||||
* @return DataResponse
|
||||
*/
|
||||
public function notifications(): DataResponse {
|
||||
try {
|
||||
$this->initViewer(true);
|
||||
|
||||
return new DataResponse([], Http::STATUS_OK);
|
||||
} catch (Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @NoCSRFRequired
|
||||
* @PublicPage
|
||||
|
@ -273,18 +256,133 @@ class ApiController extends Controller {
|
|||
bool $local = false,
|
||||
int $limit = 20,
|
||||
int $max_id = 0,
|
||||
int $min_id = 0
|
||||
int $min_id = 0,
|
||||
int $since = 0
|
||||
): DataResponse {
|
||||
try {
|
||||
$this->initViewer(true);
|
||||
|
||||
$options = new TimelineOptions($this->request);
|
||||
$options->setFormat(ACore::FORMAT_LOCAL);
|
||||
$options->setTimeline($timeline);
|
||||
$options->setLocal($local);
|
||||
$options->setLimit($limit);
|
||||
$options->setMaxId($max_id);
|
||||
$options->setMinId($min_id);
|
||||
$options->setTimeline($timeline)
|
||||
->setLocal($local)
|
||||
->setLimit($limit)
|
||||
->setMaxId($max_id)
|
||||
->setMinId($min_id)
|
||||
->setSince($since);
|
||||
|
||||
$posts = $this->streamService->getTimeline($options);
|
||||
|
||||
return new DataResponse($posts, Http::STATUS_OK);
|
||||
} catch (Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @NoCSRFRequired
|
||||
* @PublicPage
|
||||
*
|
||||
* @param int $limit
|
||||
* @param int $max_id
|
||||
* @param int $min_id
|
||||
* @param int $since
|
||||
*
|
||||
* @return DataResponse
|
||||
*/
|
||||
public function favourites(
|
||||
int $limit = 20,
|
||||
int $max_id = 0,
|
||||
int $min_id = 0,
|
||||
int $since = 0
|
||||
): DataResponse {
|
||||
try {
|
||||
$this->initViewer(true);
|
||||
|
||||
$options = new TimelineOptions($this->request);
|
||||
$options->setFormat(ACore::FORMAT_LOCAL);
|
||||
$options->setTimeline(TimelineOptions::TIMELINE_FAVOURITES)
|
||||
->setLimit($limit)
|
||||
->setMaxId($max_id)
|
||||
->setMinId($min_id)
|
||||
->setSince($since);
|
||||
|
||||
$posts = $this->streamService->getTimeline($options);
|
||||
|
||||
return new DataResponse($posts, Http::STATUS_OK);
|
||||
} catch (Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @NoCSRFRequired
|
||||
* @PublicPage
|
||||
*
|
||||
* @return DataResponse
|
||||
*/
|
||||
public function notifications(
|
||||
int $limit = 20,
|
||||
int $max_id = 0,
|
||||
int $min_id = 0,
|
||||
int $since = 0,
|
||||
array $types = [],
|
||||
array $exclude_types = [],
|
||||
string $accountId = ''
|
||||
): DataResponse {
|
||||
try {
|
||||
$this->initViewer(true);
|
||||
|
||||
$options = new TimelineOptions($this->request);
|
||||
$options->setFormat(ACore::FORMAT_LOCAL);
|
||||
$options->setTimeline(TimelineOptions::TIMELINE_NOTIFICATIONS)
|
||||
->setLimit($limit)
|
||||
->setMaxId($max_id)
|
||||
->setMinId($min_id)
|
||||
->setSince($since)
|
||||
->setTypes($types)
|
||||
->setExcludeTypes($exclude_types)
|
||||
->setAccountId($accountId);
|
||||
|
||||
$posts = $this->streamService->getTimeline($options);
|
||||
|
||||
return new DataResponse($posts, Http::STATUS_OK);
|
||||
} catch (Exception $e) {
|
||||
return $this->error($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @NoCSRFRequired
|
||||
* @PublicPage
|
||||
*
|
||||
* @return DataResponse
|
||||
*/
|
||||
public function tag(
|
||||
string $hashtag,
|
||||
int $limit = 20,
|
||||
int $max_id = 0,
|
||||
int $min_id = 0,
|
||||
int $since = 0,
|
||||
bool $local = false,
|
||||
bool $only_media = false
|
||||
): DataResponse {
|
||||
try {
|
||||
$this->initViewer(true);
|
||||
|
||||
$options = new TimelineOptions($this->request);
|
||||
$options->setFormat(ACore::FORMAT_LOCAL);
|
||||
$options->setTimeline('hashtag')
|
||||
->setLimit($limit)
|
||||
->setMaxId($max_id)
|
||||
->setMinId($min_id)
|
||||
->setSince($since)
|
||||
->setLocal($local)
|
||||
->setOnlyMedia($only_media)
|
||||
->setArgument($hashtag);
|
||||
|
||||
$posts = $this->streamService->getTimeline($options);
|
||||
|
||||
|
|
|
@ -36,7 +36,6 @@ use OCA\Social\Exceptions\ClientNotFoundException;
|
|||
use OCA\Social\Exceptions\InstanceDoesNotExistException;
|
||||
use OCA\Social\Model\Client\SocialClient;
|
||||
use OCA\Social\Service\AccountService;
|
||||
use OCA\Social\Service\CacheActorService;
|
||||
use OCA\Social\Service\ClientService;
|
||||
use OCA\Social\Service\ConfigService;
|
||||
use OCA\Social\Service\InstanceService;
|
||||
|
|
|
@ -33,7 +33,6 @@ namespace OCA\Social\Db;
|
|||
use OCA\Social\Tools\Traits\TArrayTools;
|
||||
use OCA\Social\Exceptions\SocialAppConfigException;
|
||||
use OCA\Social\Model\ActivityPub\Actor\Person;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
|
||||
class ActorsRequestBuilder extends CoreRequestBuilder {
|
||||
use TArrayTools;
|
||||
|
@ -42,7 +41,7 @@ class ActorsRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Insert request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getActorsInsertSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
@ -55,7 +54,7 @@ class ActorsRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Update request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getActorsUpdateSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
@ -90,7 +89,7 @@ class ActorsRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Delete request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getActorsDeleteSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
|
|
@ -36,7 +36,6 @@ use DateTime;
|
|||
use Doctrine\DBAL\Query\QueryBuilder;
|
||||
use Exception;
|
||||
use OC;
|
||||
use OC\DB\Connection;
|
||||
use OC\DB\SchemaWrapper;
|
||||
use OCA\Social\Exceptions\InvalidResourceException;
|
||||
use OCA\Social\Model\ActivityPub\Actor\Person;
|
||||
|
@ -65,6 +64,7 @@ class CoreRequestBuilder {
|
|||
public const TABLE_FOLLOWS = 'social_follow';
|
||||
public const TABLE_HASHTAGS = 'social_hashtag';
|
||||
public const TABLE_INSTANCE = 'social_instance';
|
||||
public const TABLE_NOTIFICATION = 'social_notif';
|
||||
public const TABLE_REQUEST_QUEUE = 'social_req_queue';
|
||||
public const TABLE_STREAM = 'social_stream';
|
||||
public const TABLE_STREAM_ACTIONS = 'social_stream_act';
|
||||
|
@ -1013,11 +1013,11 @@ class CoreRequestBuilder {
|
|||
|
||||
|
||||
/**
|
||||
* @param IQueryBuilder $qb
|
||||
* @param SocialQueryBuilder $qb
|
||||
*
|
||||
* @deprecated
|
||||
*/
|
||||
protected function leftJoinStreamAction(IQueryBuilder &$qb) {
|
||||
protected function leftJoinStreamAction(SocialQueryBuilder &$qb) {
|
||||
if ($qb->getType() !== QueryBuilder::SELECT || $this->viewer === null) {
|
||||
return;
|
||||
}
|
||||
|
@ -1187,8 +1187,8 @@ class CoreRequestBuilder {
|
|||
->selectAlias($prefix . '_f.follow_id', $prefix . '_follow_id')
|
||||
->selectAlias($prefix . '_f.creation', $prefix . '_creation')
|
||||
->leftJoin(
|
||||
$this->defaultSelectAlias, CoreRequestBuilder::TABLE_FOLLOWS, $prefix . '_f',
|
||||
$andX
|
||||
$this->defaultSelectAlias, CoreRequestBuilder::TABLE_FOLLOWS, $prefix . '_f',
|
||||
$andX
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -1263,7 +1263,7 @@ class CoreRequestBuilder {
|
|||
* this just empty all tables from the app.
|
||||
*/
|
||||
public function emptyAll() {
|
||||
$schema = new SchemaWrapper(Server::get(Connection::class));
|
||||
$schema = new SchemaWrapper(Server::get(IDBConnection::class));
|
||||
foreach (array_keys(self::$tables) as $table) {
|
||||
if ($schema->hasTable($table)) {
|
||||
$qb = $this->dbConnection->getQueryBuilder();
|
||||
|
@ -1278,7 +1278,7 @@ class CoreRequestBuilder {
|
|||
* this just empty all tables from the app.
|
||||
*/
|
||||
public function uninstallSocialTables() {
|
||||
$schema = new SchemaWrapper(Server::get(Connection::class));
|
||||
$schema = new SchemaWrapper(Server::get(IDBConnection::class));
|
||||
foreach (array_keys(self::$tables) as $table) {
|
||||
if ($schema->hasTable($table)) {
|
||||
$schema->dropTable($table);
|
||||
|
|
|
@ -32,7 +32,6 @@ declare(strict_types=1);
|
|||
namespace OCA\Social\Db;
|
||||
|
||||
use OCA\Social\Tools\Traits\TArrayTools;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
|
||||
/**
|
||||
* Class HashtagsRequestBuilder
|
||||
|
@ -46,7 +45,7 @@ class HashtagsRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Insert request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getHashtagsInsertSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
@ -59,7 +58,7 @@ class HashtagsRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Update request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getHashtagsUpdateSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
@ -91,7 +90,7 @@ class HashtagsRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Delete request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getHashtagsDeleteSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
|
|
@ -32,7 +32,6 @@ namespace OCA\Social\Db;
|
|||
|
||||
use OCA\Social\Tools\Traits\TArrayTools;
|
||||
use OCA\Social\Model\RequestQueue;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
|
||||
class RequestQueueRequestBuilder extends CoreRequestBuilder {
|
||||
use TArrayTools;
|
||||
|
@ -41,7 +40,7 @@ class RequestQueueRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Insert request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getRequestQueueInsertSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
@ -54,7 +53,7 @@ class RequestQueueRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Update request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getRequestQueueUpdateSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
@ -89,7 +88,7 @@ class RequestQueueRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Delete request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getRequestQueueDeleteSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
|
|
@ -335,8 +335,9 @@ class SocialLimitsQueryBuilder extends SocialCrossQueryBuilder {
|
|||
$expr = $this->expr();
|
||||
$pf = $this->getDefaultSelectAlias();
|
||||
|
||||
if ($options->getSinceId() > 0) {
|
||||
$this->andWhere($expr->gt($pf . '.nid', $this->createNamedParameter($options->getSinceId())));
|
||||
if ($options->getSince() > 0) {
|
||||
$options->setInverted(true);
|
||||
$this->andWhere($expr->gt($pf . '.nid', $this->createNamedParameter($options->getSince())));
|
||||
}
|
||||
|
||||
if ($options->getMaxId() > 0) {
|
||||
|
@ -344,7 +345,6 @@ class SocialLimitsQueryBuilder extends SocialCrossQueryBuilder {
|
|||
}
|
||||
|
||||
if ($options->getMinId() > 0) {
|
||||
$options->setInverted(true);
|
||||
$this->andWhere($expr->gt($pf . '.nid', $this->createNamedParameter($options->getMinId())));
|
||||
}
|
||||
|
||||
|
|
|
@ -32,7 +32,6 @@ namespace OCA\Social\Db;
|
|||
|
||||
use OCA\Social\Tools\Traits\TArrayTools;
|
||||
use OCA\Social\Model\StreamAction;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
|
||||
/**
|
||||
* Class StreamActionsRequestBuilder
|
||||
|
@ -46,7 +45,7 @@ class StreamActionsRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Insert request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getStreamActionInsertSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
@ -59,7 +58,7 @@ class StreamActionsRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Update request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getStreamActionUpdateSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
@ -91,7 +90,7 @@ class StreamActionsRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Delete request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getStreamActionDeleteSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
|
|
@ -32,7 +32,6 @@ namespace OCA\Social\Db;
|
|||
|
||||
use OCA\Social\Tools\Traits\TArrayTools;
|
||||
use OCA\Social\Model\StreamQueue;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
|
||||
class StreamQueueRequestBuilder extends CoreRequestBuilder {
|
||||
use TArrayTools;
|
||||
|
@ -41,7 +40,7 @@ class StreamQueueRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Insert request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getStreamQueueInsertSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
@ -54,7 +53,7 @@ class StreamQueueRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Update request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getStreamQueueUpdateSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
@ -88,7 +87,7 @@ class StreamQueueRequestBuilder extends CoreRequestBuilder {
|
|||
/**
|
||||
* Base of the Sql Delete request
|
||||
*
|
||||
* @return IQueryBuilder
|
||||
* @return SocialQueryBuilder
|
||||
*/
|
||||
protected function getStreamQueueDeleteSql(): SocialQueryBuilder {
|
||||
$qb = $this->getQueryBuilder();
|
||||
|
|
|
@ -338,24 +338,38 @@ class StreamRequest extends StreamRequestBuilder {
|
|||
return $this->getStreamFromRequest($qb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param TimelineOptions $options
|
||||
*
|
||||
* @return Stream[]
|
||||
*/
|
||||
public function getTimeline(TimelineOptions $options): array {
|
||||
switch (strtolower($options->getTimeline())) {
|
||||
case 'home':
|
||||
case TimelineOptions::TIMELINE_HOME:
|
||||
$result = $this->getTimelineHome($options);
|
||||
break;
|
||||
case 'direct':
|
||||
case TimelineOptions::TIMELINE_DIRECT:
|
||||
$result = $this->getTimelineDirect($options);
|
||||
break;
|
||||
case 'public':
|
||||
case TimelineOptions::TIMELINE_FAVOURITES:
|
||||
$result = $this->getTimelineFavourites($options);
|
||||
break;
|
||||
case TimelineOptions::TIMELINE_HASHTAG:
|
||||
$result = $this->getTimelineHashtag($options, $options->getArgument());
|
||||
break;
|
||||
case TimelineOptions::TIMELINE_NOTIFICATIONS:
|
||||
$options->setFormat(ACore::FORMAT_NOTIFICATION);
|
||||
$result = $this->getTimelineNotifications($options);
|
||||
break;
|
||||
case TimelineOptions::TIMELINE_PUBLIC:
|
||||
$result = $this->getTimelinePublic($options);
|
||||
break;
|
||||
|
||||
default:
|
||||
return [];
|
||||
}
|
||||
|
||||
if ($options->isInverted()) {
|
||||
// in cae we inverted the order during the request, we revert the results
|
||||
$result = array_reverse($result);
|
||||
}
|
||||
|
||||
|
@ -412,6 +426,64 @@ class StreamRequest extends StreamRequestBuilder {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param TimelineOptions $options
|
||||
*
|
||||
* @return Stream[]
|
||||
*/
|
||||
private function getTimelineFavourites(TimelineOptions $options): array {
|
||||
$qb = $this->getStreamSelectSql($options->getFormat());
|
||||
$actor = $qb->getViewer();
|
||||
$expr = $qb->expr();
|
||||
|
||||
$qb->limitToType(Note::TYPE);
|
||||
$qb->paginate($options);
|
||||
$qb->linkToCacheActors('ca', 's.attributed_to_prim');
|
||||
|
||||
$qb->selectStreamActions('sa');
|
||||
$qb->andWhere($expr->eq('sa.stream_id_prim', 's.id_prim'));
|
||||
$qb->andWhere($expr->eq('sa.actor_id_prim', $qb->createNamedParameter($qb->prim($actor->getId()))));
|
||||
$qb->andWhere($expr->eq('sa.liked', $qb->createNamedParameter(1)));
|
||||
|
||||
return $this->getStreamsFromRequest($qb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param TimelineOptions $options
|
||||
*
|
||||
* @return Stream[]
|
||||
*/
|
||||
private function getTimelineHashtag(TimelineOptions $options, string $hashtag): array {
|
||||
$qb = $this->getStreamSelectSql($options->getFormat());
|
||||
|
||||
return [];
|
||||
|
||||
return $this->getStreamsFromRequest($qb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param TimelineOptions $options
|
||||
*
|
||||
* @return Stream[]
|
||||
*/
|
||||
private function getTimelineNotifications(TimelineOptions $options): array {
|
||||
$qb = $this->getStreamSelectSql($options->getFormat());
|
||||
$actor = $qb->getViewer();
|
||||
|
||||
$qb->limitToType(SocialAppNotification::TYPE);
|
||||
$qb->paginate($options);
|
||||
|
||||
$qb->selectDestFollowing('sd', '');
|
||||
$qb->limitToDest($actor->getId(), 'notif', '', 'sd');
|
||||
$qb->linkToCacheActors('ca', 's.attributed_to_prim');
|
||||
$qb->leftJoinStreamAction();
|
||||
|
||||
return $this->getStreamsFromRequest($qb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Should return:
|
||||
* * Own posts,
|
||||
|
@ -456,8 +528,9 @@ class StreamRequest extends StreamRequestBuilder {
|
|||
*
|
||||
* @return Stream[]
|
||||
* @throws DateTimeException
|
||||
* @deprecated
|
||||
*/
|
||||
public function getTimelineNotifications(int $since = 0, int $limit = 5): array {
|
||||
public function getTimelineNotifications_dep(int $since = 0, int $limit = 5): array {
|
||||
$qb = $this->getStreamSelectSql();
|
||||
|
||||
$actor = $qb->getViewer();
|
||||
|
|
|
@ -30,9 +30,6 @@ declare(strict_types=1);
|
|||
|
||||
namespace OCA\Social\Model\ActivityPub;
|
||||
|
||||
use OCA\Social\Tools\Traits\TArrayTools;
|
||||
use OCA\Social\Tools\Traits\TPathTools;
|
||||
use OCA\Social\Tools\Traits\TStringTools;
|
||||
use JsonSerializable;
|
||||
use OCA\Social\Exceptions\ActivityCantBeVerifiedException;
|
||||
use OCA\Social\Exceptions\InvalidOriginException;
|
||||
|
@ -40,6 +37,9 @@ use OCA\Social\Exceptions\InvalidResourceEntryException;
|
|||
use OCA\Social\Exceptions\UrlCloudException;
|
||||
use OCA\Social\Model\ActivityPub\Object\Document;
|
||||
use OCA\Social\Model\LinkedDataSignature;
|
||||
use OCA\Social\Tools\Traits\TArrayTools;
|
||||
use OCA\Social\Tools\Traits\TPathTools;
|
||||
use OCA\Social\Tools\Traits\TStringTools;
|
||||
|
||||
class ACore extends Item implements JsonSerializable {
|
||||
use TArrayTools;
|
||||
|
@ -63,6 +63,7 @@ class ACore extends Item implements JsonSerializable {
|
|||
|
||||
public const FORMAT_ACTIVITYPUB = 1;
|
||||
public const FORMAT_LOCAL = 2;
|
||||
public const FORMAT_NOTIFICATION = 3;
|
||||
|
||||
|
||||
/** @var null Item */
|
||||
|
@ -681,6 +682,10 @@ class ACore extends Item implements JsonSerializable {
|
|||
return $this->exportAsLocal();
|
||||
}
|
||||
|
||||
if ($this->getExportFormat() === self::FORMAT_NOTIFICATION) {
|
||||
return $this->exportAsNotification();
|
||||
}
|
||||
|
||||
return $this->exportAsActivityPub();
|
||||
}
|
||||
|
||||
|
@ -767,4 +772,19 @@ class ACore extends Item implements JsonSerializable {
|
|||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function exportAsNotification(): array {
|
||||
$result = [
|
||||
'id' => $this->getId()
|
||||
];
|
||||
|
||||
if ($this->getNid() > 0) {
|
||||
$result['id'] = (string)$this->getNid();
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,14 +30,17 @@ declare(strict_types=1);
|
|||
|
||||
namespace OCA\Social\Model\ActivityPub;
|
||||
|
||||
use OCA\Social\Tools\IQueryRow;
|
||||
use OCA\Social\Tools\Model\Cache;
|
||||
use OCA\Social\Tools\Model\CacheItem;
|
||||
use DateTime;
|
||||
use Exception;
|
||||
use JsonSerializable;
|
||||
use OCA\Social\Model\ActivityPub\Actor\Person;
|
||||
use OCA\Social\Model\ActivityPub\Object\Announce;
|
||||
use OCA\Social\Model\ActivityPub\Object\Follow;
|
||||
use OCA\Social\Model\ActivityPub\Object\Like;
|
||||
use OCA\Social\Model\StreamAction;
|
||||
use OCA\Social\Tools\IQueryRow;
|
||||
use OCA\Social\Tools\Model\Cache;
|
||||
use OCA\Social\Tools\Model\CacheItem;
|
||||
use OCA\Social\Traits\TDetails;
|
||||
|
||||
/**
|
||||
|
@ -496,4 +499,35 @@ class Stream extends ACore implements IQueryRow, JsonSerializable {
|
|||
|
||||
return array_merge(parent::exportAsLocal(), $result);
|
||||
}
|
||||
|
||||
|
||||
public function exportAsNotification(): array {
|
||||
switch ($this->getSubType()) {
|
||||
case Like::TYPE:
|
||||
$type = 'favourites';
|
||||
break;
|
||||
case Announce::TYPE:
|
||||
$type = 'mention';
|
||||
break;
|
||||
case Follow::TYPE:
|
||||
$type = 'follow';
|
||||
break;
|
||||
default:
|
||||
$type = '';
|
||||
}
|
||||
|
||||
$result = [
|
||||
'id' => $this->getId(),
|
||||
'type' => $type,
|
||||
'created_at' => $this->getOriginCreationTime(),
|
||||
'status' => $this->getDetails('post')
|
||||
];
|
||||
|
||||
if ($this->hasActor()) {
|
||||
$actor = $this->getActor();
|
||||
$result['account'] = $actor->exportAsLocal();
|
||||
}
|
||||
|
||||
return array_merge(parent::exportAsNotification(), $result);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,22 +44,35 @@ use OCP\IRequest;
|
|||
class TimelineOptions extends CoreOptions implements JsonSerializable {
|
||||
use TArrayTools;
|
||||
|
||||
public const TIMELINE_HOME = 'home';
|
||||
public const TIMELINE_PUBLIC = 'public';
|
||||
public const TIMELINE_DIRECT = 'direct';
|
||||
public const TIMELINE_FAVOURITES = 'favourites';
|
||||
public const TIMELINE_HASHTAG = 'hashtag';
|
||||
public const TIMELINE_NOTIFICATIONS = 'notifications';
|
||||
|
||||
private string $timeline = '';
|
||||
private bool $local = false;
|
||||
private bool $remote = false;
|
||||
private bool $onlyMedia = false;
|
||||
private int $minId = 0;
|
||||
private int $maxId = 0;
|
||||
private int $sinceId = 0;
|
||||
private int $since = 0;
|
||||
private int $limit = 20;
|
||||
private bool $inverted = false;
|
||||
private string $argument = '';
|
||||
private array $types = [];
|
||||
private array $excludeTypes = [];
|
||||
private string $accountId = '';
|
||||
|
||||
public static array $availableTimelines = [
|
||||
'home',
|
||||
'public'
|
||||
self::TIMELINE_HOME,
|
||||
self::TIMELINE_PUBLIC,
|
||||
self::TIMELINE_DIRECT,
|
||||
self::TIMELINE_FAVOURITES,
|
||||
self::TIMELINE_NOTIFICATIONS
|
||||
];
|
||||
|
||||
|
||||
/**
|
||||
* TimelineOptions constructor.
|
||||
*
|
||||
|
@ -197,17 +210,17 @@ class TimelineOptions extends CoreOptions implements JsonSerializable {
|
|||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function getSinceId(): int {
|
||||
return $this->sinceId;
|
||||
public function getSince(): int {
|
||||
return $this->since;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $sinceId
|
||||
* @param int $since
|
||||
*
|
||||
* @return TimelineOptions
|
||||
*/
|
||||
public function setSinceId(int $sinceId): self {
|
||||
$this->sinceId = $sinceId;
|
||||
public function setSince(int $since): self {
|
||||
$this->since = $since;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
@ -251,6 +264,83 @@ class TimelineOptions extends CoreOptions implements JsonSerializable {
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string $argument
|
||||
*
|
||||
* @return TimelineOptions
|
||||
*/
|
||||
public function setArgument(string $argument): self {
|
||||
$this->argument = $argument;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getArgument(): string {
|
||||
return $this->argument;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param array $types
|
||||
*
|
||||
* @return TimelineOptions
|
||||
*/
|
||||
public function setTypes(array $types): self {
|
||||
$this->types = $types;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getTypes(): array {
|
||||
return $this->types;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param array $excludeTypes
|
||||
*
|
||||
* @return TimelineOptions
|
||||
*/
|
||||
public function setExcludeTypes(array $excludeTypes): self {
|
||||
$this->excludeTypes = $excludeTypes;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getExcludeTypes(): array {
|
||||
return $this->excludeTypes;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string $accountId
|
||||
*
|
||||
* @return TimelineOptions
|
||||
*/
|
||||
public function setAccountId(string $accountId): self {
|
||||
$this->accountId = $accountId;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getAccountId(): string {
|
||||
return $this->accountId;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param array $arr
|
||||
*
|
||||
|
@ -262,8 +352,9 @@ class TimelineOptions extends CoreOptions implements JsonSerializable {
|
|||
$this->setRemote($this->getBool('only_media', $arr, $this->isOnlyMedia()));
|
||||
$this->setMinId($this->getInt('min_id', $arr, $this->getMinId()));
|
||||
$this->setMaxId($this->getInt('max_id', $arr, $this->getMaxId()));
|
||||
$this->setSinceId($this->getInt('since_id', $arr, $this->getSinceId()));
|
||||
$this->setSince($this->getInt('since', $arr, $this->getSince()));
|
||||
$this->setLimit($this->getInt('limit', $arr, $this->getLimit()));
|
||||
$this->setArgument($this->get('argument', $arr, $this->getArgument()));
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
@ -281,8 +372,9 @@ class TimelineOptions extends CoreOptions implements JsonSerializable {
|
|||
'only_media' => $this->isOnlyMedia(),
|
||||
'min_id' => $this->getMinId(),
|
||||
'max_id' => $this->getMaxId(),
|
||||
'since_id' => $this->getSinceId(),
|
||||
'limit' => $this->getLimit()
|
||||
'since' => $this->getSince(),
|
||||
'limit' => $this->getLimit(),
|
||||
'argument' => $this->getArgument()
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -52,7 +52,6 @@ use OCA\Social\Tools\Model\NCRequest;
|
|||
use OCA\Social\Tools\Model\Request;
|
||||
use OCA\Social\Tools\Traits\TArrayTools;
|
||||
use OCA\Social\Tools\Traits\TPathTools;
|
||||
use OCP\AppFramework\Http;
|
||||
use Psr\Log\LoggerInterface;
|
||||
|
||||
class CurlService {
|
||||
|
|
|
@ -431,7 +431,7 @@ class StreamService {
|
|||
* @deprecated
|
||||
*/
|
||||
public function getStreamNotifications(int $since = 0, int $limit = 5): array {
|
||||
return $this->streamRequest->getTimelineNotifications($since, $limit);
|
||||
return $this->streamRequest->getTimelineNotifications_dep($since, $limit);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -56,6 +56,13 @@
|
|||
<code>$this->instance</code>
|
||||
</NullableReturnStatement>
|
||||
</file>
|
||||
<file src="lib/Db/CoreRequestBuilder.php">
|
||||
<UndefinedMethod occurrences="3">
|
||||
<code>dropTable</code>
|
||||
<code>hasTable</code>
|
||||
<code>hasTable</code>
|
||||
</UndefinedMethod>
|
||||
</file>
|
||||
<file src="lib/Service/CheckService.php">
|
||||
<RedundantCast occurrences="1">
|
||||
<code>(bool)($this->cache->get(self::CACHE_PREFIX . 'wellknown') === 'true')</code>
|
||||
|
@ -71,6 +78,9 @@
|
|||
<RedundantCondition occurrences="1">
|
||||
<code>is_array($result)</code>
|
||||
</RedundantCondition>
|
||||
<TypeDoesNotContainType occurrences="1">
|
||||
<code>$this->maxDownloadSizeReached === true</code>
|
||||
</TypeDoesNotContainType>
|
||||
</file>
|
||||
<file src="lib/Service/FollowService.php">
|
||||
<InvalidReturnStatement occurrences="2">
|
||||
|
|
Ładowanie…
Reference in New Issue