From db6282b5e2be2993a83876e7b98c7f04c460ca1a Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 6 Sep 2020 07:12:04 +0000 Subject: [PATCH] API: Counts added, local query improved --- src/Factory/Api/Mastodon/Status.php | 9 ++- .../Api/Mastodon/Timelines/PublicTimeline.php | 8 +-- src/Object/Api/Mastodon/Activity.php | 55 +++++++++++++++++++ src/Object/Api/Mastodon/Application.php | 46 ++++++++++++++++ src/Object/Api/Mastodon/Status.php | 8 +-- 5 files changed, 117 insertions(+), 9 deletions(-) create mode 100644 src/Object/Api/Mastodon/Activity.php create mode 100644 src/Object/Api/Mastodon/Application.php diff --git a/src/Factory/Api/Mastodon/Status.php b/src/Factory/Api/Mastodon/Status.php index 9a7589a6e..6295b4469 100644 --- a/src/Factory/Api/Mastodon/Status.php +++ b/src/Factory/Api/Mastodon/Status.php @@ -23,9 +23,12 @@ namespace Friendica\Factory\Api\Mastodon; use Friendica\App\BaseURL; use Friendica\BaseFactory; +use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Item; +use Friendica\Model\Verb; use Friendica\Network\HTTPException; +use Friendica\Protocol\Activity; use Friendica\Repository\ProfileField; use Psr\Log\LoggerInterface; @@ -59,6 +62,10 @@ class Status extends BaseFactory $item = Item::selectFirst([], ['uri-id' => $uriId, 'uid' => $uid]); $account = DI::mstdnAccount()->createFromContactId($item['author-id']); - return new \Friendica\Object\Api\Mastodon\Status($item, $account); + $count['replies'] = DBA::count('item', ['thr-parent-id' => $uriId, 'uid' => $uid, 'gravity' => GRAVITY_COMMENT]); + $count['reblogs'] = DBA::count('item', ['thr-parent-id' => $uriId, 'uid' => $uid, 'gravity' => GRAVITY_ACTIVITY, 'vid' => Verb::getID(Activity::ANNOUNCE)]); + $count['favourites'] = DBA::count('item', ['thr-parent-id' => $uriId, 'uid' => $uid, 'gravity' => GRAVITY_ACTIVITY, 'vid' => Verb::getID(Activity::LIKE)]); + + return new \Friendica\Object\Api\Mastodon\Status($item, $account, $count); } } diff --git a/src/Module/Api/Mastodon/Timelines/PublicTimeline.php b/src/Module/Api/Mastodon/Timelines/PublicTimeline.php index 9a42521d9..598cfe5c6 100644 --- a/src/Module/Api/Mastodon/Timelines/PublicTimeline.php +++ b/src/Module/Api/Mastodon/Timelines/PublicTimeline.php @@ -57,11 +57,11 @@ class PublicTimeline extends BaseApi $params = ['order' => ['uri-id' => true], 'limit' => $limit]; - $condition = ['gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT], 'private' => Item::PUBLIC, 'network' => Protocol::FEDERATED]; + $condition = ['gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT], 'private' => Item::PUBLIC, + 'uid' => 0, 'network' => Protocol::FEDERATED]; + if ($local) { - $condition['origin'] = true; - } else { - $condition['uid'] = 0; + $condition = DBA::mergeConditions($condition, ["`uri-id` IN (SELECT `uri-id` FROM `item` WHERE `origin`)"]); } if ($remote) { diff --git a/src/Object/Api/Mastodon/Activity.php b/src/Object/Api/Mastodon/Activity.php new file mode 100644 index 000000000..a73307eb4 --- /dev/null +++ b/src/Object/Api/Mastodon/Activity.php @@ -0,0 +1,55 @@ +. + * + */ + +namespace Friendica\Object\Api\Mastodon; + +use Friendica\BaseEntity; + +/** + * Class Activity + * + * @see https://docs.joinmastodon.org/entities/activity + */ +class Activity extends BaseEntity +{ + /** @var string (UNIX Timestamp) */ + protected $week; + /** @var string */ + protected $statuses; + /** @var string */ + protected $logins; + /** @var string */ + protected $registrations; + + /** + * Creates an activity + * + * @param array $item + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function __construct(int $week, int $statuses, int $logins, int $registrations) + { + $this->week = (string)$week; + $this->statuses = (string)$statuses; + $this->logins = (string)$logins; + $this->registrations = (string)$registrations; + } +} diff --git a/src/Object/Api/Mastodon/Application.php b/src/Object/Api/Mastodon/Application.php new file mode 100644 index 000000000..d26d270d9 --- /dev/null +++ b/src/Object/Api/Mastodon/Application.php @@ -0,0 +1,46 @@ +. + * + */ + +namespace Friendica\Object\Api\Mastodon; + +use Friendica\BaseEntity; + +/** + * Class Application + * + * @see https://docs.joinmastodon.org/entities/application + */ +class Application extends BaseEntity +{ + /** @var string */ + protected $name; + + /** + * Creates an application entry + * + * @param array $item + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function __construct(string $name) + { + $this->name = $name; + } +} diff --git a/src/Object/Api/Mastodon/Status.php b/src/Object/Api/Mastodon/Status.php index 5ebddf469..ea9326caf 100644 --- a/src/Object/Api/Mastodon/Status.php +++ b/src/Object/Api/Mastodon/Status.php @@ -95,7 +95,7 @@ class Status extends BaseEntity * @param array $item * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public function __construct(array $item, Account $account) + public function __construct(array $item, Account $account, array $count) { $this->id = (string)$item['uri-id']; $this->created_at = DateTimeFormat::utc($item['created'], DateTimeFormat::ATOM); @@ -114,9 +114,9 @@ class Status extends BaseEntity $this->language = null; $this->uri = $item['uri']; $this->url = $item['plink'] ?? null; - $this->replies_count = 0; - $this->reblogs_count = 0; - $this->favourites_count = 0; + $this->replies_count = $count['replies']; + $this->reblogs_count = $count['reblogs']; + $this->favourites_count = $count['favourites']; $this->favourited = false; $this->reblogged = false; $this->muted = false;