diff --git a/src/Factory/Api/Mastodon/Status.php b/src/Factory/Api/Mastodon/Status.php index 9a7589a6e..c31c211a5 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,12 @@ 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); + $counts = new \Friendica\Object\Api\Mastodon\Status\Counts( + DBA::count('item', ['thr-parent-id' => $uriId, 'uid' => $uid, 'gravity' => GRAVITY_COMMENT]), + DBA::count('item', ['thr-parent-id' => $uriId, 'uid' => $uid, 'gravity' => GRAVITY_ACTIVITY, 'vid' => Verb::getID(Activity::ANNOUNCE)]), + 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, $counts); } } 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..aa26fa198 100644 --- a/src/Object/Api/Mastodon/Status.php +++ b/src/Object/Api/Mastodon/Status.php @@ -23,6 +23,7 @@ namespace Friendica\Object\Api\Mastodon; use Friendica\BaseEntity; use Friendica\Content\Text\BBCode; +use Friendica\Object\Api\Mastodon\Status\Counts; use Friendica\Util\DateTimeFormat; /** @@ -95,7 +96,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, Counts $counts) { $this->id = (string)$item['uri-id']; $this->created_at = DateTimeFormat::utc($item['created'], DateTimeFormat::ATOM); @@ -114,9 +115,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 = $counts->replies; + $this->reblogs_count = $counts->reblogs; + $this->favourites_count = $counts->favourites; $this->favourited = false; $this->reblogged = false; $this->muted = false; diff --git a/src/Object/Api/Mastodon/Status/Counts.php b/src/Object/Api/Mastodon/Status/Counts.php new file mode 100644 index 000000000..2c446c36c --- /dev/null +++ b/src/Object/Api/Mastodon/Status/Counts.php @@ -0,0 +1,56 @@ +. + * + */ + +namespace Friendica\Object\Api\Mastodon\Status; + +/** + * Class Counts + * + * @see https://docs.joinmastodon.org/entities/status + */ +class Counts +{ + /** @var int */ + protected $replies; + /** @var int */ + protected $reblogs; + /** @var int */ + protected $favourites; + + /** + * Creates a status count object + * + * @param int $replies + * @param int $reblogs + * @param int $favourites + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function __construct(int $replies, int $reblogs, int $favourites) + { + $this->replies = $replies; + $this->reblogs = $reblogs; + $this->favourites = $favourites; + } + + public function __get($name) { + return $this->$name; + } +}