diff --git a/src/Content/Item.php b/src/Content/Item.php index 87d719719b..0d47cde92f 100644 --- a/src/Content/Item.php +++ b/src/Content/Item.php @@ -950,18 +950,19 @@ class Item public function initializePost(array $post): array { - $post['network'] = Protocol::DFRN; - $post['protocol'] = Conversation::PARCEL_DIRECT; - $post['direction'] = Conversation::PUSH; - $post['received'] = DateTimeFormat::utcNow(); - $post['origin'] = true; - $post['wall'] = $post['wall'] ?? true; - $post['guid'] = $post['guid'] ?? System::createUUID(); - $post['verb'] = $post['verb'] ?? Activity::POST; + $post['network'] = Protocol::DFRN; + $post['protocol'] = Conversation::PARCEL_DIRECT; + $post['direction'] = Conversation::PUSH; + $post['received'] = DateTimeFormat::utcNow(); + $post['origin'] = true; + $post['wall'] = $post['wall'] ?? true; + $post['guid'] = $post['guid'] ?? System::createUUID(); + $post['verb'] = $post['verb'] ?? Activity::POST; + $post['uri'] = $post['uri'] ?? ItemModel::newURI($post['guid']); + $post['thr-parent'] = $post['thr-parent'] ?? $post['uri']; - if (empty($post['uri'])) { - $post['thr-parent'] = $post['uri'] = ItemModel::newURI($post['guid']); - $post['gravity'] = ItemModel::GRAVITY_PARENT; + if (empty($post['gravity'])) { + $post['gravity'] = ($post['uri'] == $post['thr-parent']) ? ItemModel::GRAVITY_PARENT : ItemModel::GRAVITY_COMMENT; } $owner = User::getOwnerDataById($post['uid']); diff --git a/src/Factory/Api/Mastodon/Status.php b/src/Factory/Api/Mastodon/Status.php index 1b569d57e5..ad2d9bab35 100644 --- a/src/Factory/Api/Mastodon/Status.php +++ b/src/Factory/Api/Mastodon/Status.php @@ -79,15 +79,15 @@ class Status extends BaseFactory /** * @param int $uriId Uri-ID of the item * @param int $uid Item user + * @param bool $display_quote Display quoted posts * @param bool $reblog Check for reblogged post * @param bool $in_reply_status Add an "in_reply_status" element - * @param bool $display_quote Display quoted posts * * @return \Friendica\Object\Api\Mastodon\Status * @throws HTTPException\InternalServerErrorException * @throws ImagickException|HTTPException\NotFoundException */ - public function createFromUriId(int $uriId, int $uid = 0, bool $reblog = true, bool $in_reply_status = true, bool $display_quote = false): \Friendica\Object\Api\Mastodon\Status + public function createFromUriId(int $uriId, int $uid = 0, bool $display_quote = false, bool $reblog = true, bool $in_reply_status = true): \Friendica\Object\Api\Mastodon\Status { $fields = ['uri-id', 'uid', 'author-id', 'causer-id', 'author-uri-id', 'author-link', 'causer-uri-id', 'post-reason', 'starred', 'app', 'title', 'body', 'raw-body', 'content-warning', 'question-id', 'created', 'network', 'thr-parent-id', 'parent-author-id', 'language', 'uri', 'plink', 'private', 'vid', 'gravity', 'featured', 'has-media', 'quote-uri-id']; @@ -198,33 +198,6 @@ class Status extends BaseFactory $poll = null; } - $shared = $this->contentItem->getSharedPost($item, ['uri-id']); - if (!empty($shared)) { - $shared_uri_id = $shared['post']['uri-id']; - - foreach ($this->mstdnMentionFactory->createFromUriId($shared_uri_id)->getArrayCopy() as $mention) { - if (!in_array($mention, $mentions)) { - $mentions[] = $mention; - } - } - - foreach ($this->mstdnTagFactory->createFromUriId($shared_uri_id) as $tag) { - if (!in_array($tag, $tags)) { - $tags[] = $tag; - } - } - - foreach ($this->mstdnAttachementFactory->createFromUriId($shared_uri_id) as $attachment) { - if (!in_array($attachment, $attachments)) { - $attachments[] = $attachment; - } - } - - if (empty($card->toArray())) { - $card = $this->mstdnCardFactory->createFromUriId($shared_uri_id); - } - } - if ($display_quote) { $quote = self::createQuote($item, $uid); @@ -237,6 +210,35 @@ class Status extends BaseFactory // We can always safely add attached activities. Real quotes are added to the body via "addSharedPost". if (empty($item['quote-uri-id'])) { $quote = self::createQuote($item, $uid); + } else { + $quote = []; + } + + $shared = $this->contentItem->getSharedPost($item, ['uri-id']); + if (!empty($shared)) { + $shared_uri_id = $shared['post']['uri-id']; + + foreach ($this->mstdnMentionFactory->createFromUriId($shared_uri_id)->getArrayCopy() as $mention) { + if (!in_array($mention, $mentions)) { + $mentions[] = $mention; + } + } + + foreach ($this->mstdnTagFactory->createFromUriId($shared_uri_id) as $tag) { + if (!in_array($tag, $tags)) { + $tags[] = $tag; + } + } + + foreach ($this->mstdnAttachementFactory->createFromUriId($shared_uri_id) as $attachment) { + if (!in_array($attachment, $attachments)) { + $attachments[] = $attachment; + } + } + + if (empty($card->toArray())) { + $card = $this->mstdnCardFactory->createFromUriId($shared_uri_id); + } } $item['body'] = $this->contentItem->addSharedPost($item); @@ -247,13 +249,13 @@ class Status extends BaseFactory } if ($is_reshare) { - $reshare = $this->createFromUriId($uriId, $uid, false, false)->toArray(); + $reshare = $this->createFromUriId($uriId, $uid, $display_quote, false, false)->toArray(); } else { $reshare = []; } if ($in_reply_status && ($item['gravity'] == Item::GRAVITY_COMMENT)) { - $in_reply = $this->createFromUriId($item['thr-parent-id'], $uid, false, false)->toArray(); + $in_reply = $this->createFromUriId($item['thr-parent-id'], $uid, $display_quote, false, false)->toArray(); } else { $in_reply = []; } @@ -281,7 +283,7 @@ class Status extends BaseFactory } if (!empty($quote_id)) { - $quote = $this->createFromUriId($quote_id, $uid, false, false)->toArray(); + $quote = $this->createFromUriId($quote_id, $uid, false, false, false)->toArray(); } else { $quote = []; } diff --git a/src/Module/Api/Mastodon/Accounts/Statuses.php b/src/Module/Api/Mastodon/Accounts/Statuses.php index 6b1a64a5de..067e330271 100644 --- a/src/Module/Api/Mastodon/Accounts/Statuses.php +++ b/src/Module/Api/Mastodon/Accounts/Statuses.php @@ -113,11 +113,13 @@ class Statuses extends BaseApi $items = Post::selectForUser($uid, ['uri-id'], $condition, $params); } + $display_quotes = self::appSupportsQuotes(); + $statuses = []; while ($item = Post::fetch($items)) { self::setBoundaries($item['uri-id']); try { - $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); + $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, $display_quotes); } catch (\Throwable $th) { Logger::info('Post not fetchable', ['uri-id' => $item['uri-id'], 'uid' => $uid, 'error' => $th]); } diff --git a/src/Module/Api/Mastodon/Bookmarks.php b/src/Module/Api/Mastodon/Bookmarks.php index b027836ef4..411e8b1d06 100644 --- a/src/Module/Api/Mastodon/Bookmarks.php +++ b/src/Module/Api/Mastodon/Bookmarks.php @@ -69,10 +69,12 @@ class Bookmarks extends BaseApi $items = Post::selectThreadForUser($uid, ['uri-id'], $condition, $params); + $display_quotes = self::appSupportsQuotes(); + $statuses = []; while ($item = Post::fetch($items)) { self::setBoundaries($item['uri-id']); - $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); + $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, $display_quotes); } DBA::close($items); diff --git a/src/Module/Api/Mastodon/Favourited.php b/src/Module/Api/Mastodon/Favourited.php index 941c4a5530..dfbaa0ded5 100644 --- a/src/Module/Api/Mastodon/Favourited.php +++ b/src/Module/Api/Mastodon/Favourited.php @@ -45,8 +45,9 @@ class Favourited extends BaseApi $request = $this->getRequest([ 'limit' => 20, // Maximum number of results to return. Defaults to 20. - 'min_id' => 0, // Return results immediately newer than id 'max_id' => 0, // Return results older than id + 'since_id' => 0, // Return results newer than this ID. Use HTTP Link header to paginate. + 'min_id' => 0, // Return results immediately newer than id 'with_muted' => false, // Pleroma extension: return activities by muted (not by blocked!) users. ], $request); @@ -58,6 +59,10 @@ class Favourited extends BaseApi $condition = DBA::mergeConditions($condition, ["`thr-parent-id` < ?", $request['max_id']]); } + if (!empty($request['since_id'])) { + $condition = DBA::mergeConditions($condition, ["`thr-parent-id` > ?", $request['since_id']]); + } + if (!empty($request['min_id'])) { $condition = DBA::mergeConditions($condition, ["`thr-parent-id` > ?", $request['min_id']]); @@ -66,10 +71,12 @@ class Favourited extends BaseApi $items = Post::selectForUser($uid, ['thr-parent-id'], $condition, $params); + $display_quotes = self::appSupportsQuotes(); + $statuses = []; while ($item = Post::fetch($items)) { self::setBoundaries($item['thr-parent-id']); - $statuses[] = DI::mstdnStatus()->createFromUriId($item['thr-parent-id'], $uid); + $statuses[] = DI::mstdnStatus()->createFromUriId($item['thr-parent-id'], $uid, $display_quotes); } DBA::close($items); diff --git a/src/Module/Api/Mastodon/Search.php b/src/Module/Api/Mastodon/Search.php index 72500cb628..a991052c7f 100644 --- a/src/Module/Api/Mastodon/Search.php +++ b/src/Module/Api/Mastodon/Search.php @@ -142,7 +142,7 @@ class Search extends BaseApi // If the user-specific search failed, we search and probe a public post $item_id = Item::fetchByLink($q, $uid) ?: Item::fetchByLink($q); if ($item_id && $item = Post::selectFirst(['uri-id'], ['id' => $item_id])) { - return DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); + return DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, self::appSupportsQuotes()); } } @@ -176,10 +176,12 @@ class Search extends BaseApi $items = DBA::select($table, ['uri-id'], $condition, $params); + $display_quotes = self::appSupportsQuotes(); + $statuses = []; while ($item = Post::fetch($items)) { self::setBoundaries($item['uri-id']); - $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); + $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, $display_quotes); } DBA::close($items); diff --git a/src/Module/Api/Mastodon/Statuses.php b/src/Module/Api/Mastodon/Statuses.php index 7419cccb38..c803835d1d 100644 --- a/src/Module/Api/Mastodon/Statuses.php +++ b/src/Module/Api/Mastodon/Statuses.php @@ -88,7 +88,7 @@ class Statuses extends BaseApi Item::update($item, ['id' => $post['id']]); Item::updateDisplayCache($post['uri-id']); - System::jsonExit(DI::mstdnStatus()->createFromUriId($post['uri-id'], $uid)); + System::jsonExit(DI::mstdnStatus()->createFromUriId($post['uri-id'], $uid, self::appSupportsQuotes())); } protected function post(array $request = []) @@ -269,7 +269,7 @@ class Statuses extends BaseApi if (!empty($id)) { $item = Post::selectFirst(['uri-id'], ['id' => $id]); if (!empty($item['uri-id'])) { - System::jsonExit(DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid)); + System::jsonExit(DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, self::appSupportsQuotes())); } } @@ -308,7 +308,7 @@ class Statuses extends BaseApi DI::mstdnError()->UnprocessableEntity(); } - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, false)); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes(), false)); } private function getApp(): string diff --git a/src/Module/Api/Mastodon/Statuses/Bookmark.php b/src/Module/Api/Mastodon/Statuses/Bookmark.php index 7696995596..b5e8a540d0 100644 --- a/src/Module/Api/Mastodon/Statuses/Bookmark.php +++ b/src/Module/Api/Mastodon/Statuses/Bookmark.php @@ -65,6 +65,6 @@ class Bookmark extends BaseApi Item::update(['starred' => true], ['id' => $item['id']]); - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes())->toArray()); } } diff --git a/src/Module/Api/Mastodon/Statuses/Context.php b/src/Module/Api/Mastodon/Statuses/Context.php index c18a003d56..76677de4ad 100644 --- a/src/Module/Api/Mastodon/Statuses/Context.php +++ b/src/Module/Api/Mastodon/Statuses/Context.php @@ -45,6 +45,9 @@ class Context extends BaseApi } $request = $this->getRequest([ + 'max_id' => 0, // Return results older than this id + 'since_id' => 0, // Return results newer than this id + 'min_id' => 0, // Return results immediately newer than this id 'limit' => 40, // Maximum number of results to return. Defaults to 40. ], $request); @@ -55,17 +58,36 @@ class Context extends BaseApi $parent = Post::selectFirst(['parent-uri-id'], ['uri-id' => $id]); if (DBA::isResult($parent)) { - $posts = Post::selectPosts(['uri-id', 'thr-parent-id'], - ['parent-uri-id' => $parent['parent-uri-id'], 'gravity' => [Item::GRAVITY_PARENT, Item::GRAVITY_COMMENT]]); + $params = ['order' => ['uri-id' => true]]; + $condition = ['parent-uri-id' => $parent['parent-uri-id'], 'gravity' => [Item::GRAVITY_PARENT, Item::GRAVITY_COMMENT]]; + + if (!empty($request['max_id'])) { + $condition = DBA::mergeConditions($condition, ["`uri-id` < ?", $request['max_id']]); + } + + if (!empty($request['since_id'])) { + $condition = DBA::mergeConditions($condition, ["`uri-id` > ?", $request['since_id']]); + } + + if (!empty($request['min_id'])) { + $condition = DBA::mergeConditions($condition, ["`uri-id` > ?", $request['min_id']]); + $params['order'] = ['uri-id']; + } + + $posts = Post::selectPosts(['uri-id', 'thr-parent-id'], $condition, $params); while ($post = Post::fetch($posts)) { if ($post['uri-id'] == $post['thr-parent-id']) { continue; } + self::setBoundaries($post['uri-id']); + $parents[$post['uri-id']] = $post['thr-parent-id']; $children[$post['thr-parent-id']][] = $post['uri-id']; } DBA::close($posts); + + self::setLinkHeader(); } else { $parent = DBA::selectFirst('mail', ['parent-uri-id'], ['uri-id' => $id, 'uid' => $uid]); if (DBA::isResult($parent)) { @@ -90,8 +112,10 @@ class Context extends BaseApi asort($ancestors); + $display_quotes = self::appSupportsQuotes(); + foreach (array_slice($ancestors, 0, $request['limit']) as $ancestor) { - $statuses['ancestors'][] = DI::mstdnStatus()->createFromUriId($ancestor, $uid);; + $statuses['ancestors'][] = DI::mstdnStatus()->createFromUriId($ancestor, $uid, $display_quotes); } $descendants = self::getChildren($id, $children); @@ -99,7 +123,7 @@ class Context extends BaseApi asort($descendants); foreach (array_slice($descendants, 0, $request['limit']) as $descendant) { - $statuses['descendants'][] = DI::mstdnStatus()->createFromUriId($descendant, $uid); + $statuses['descendants'][] = DI::mstdnStatus()->createFromUriId($descendant, $uid, $display_quotes); } System::jsonExit($statuses); diff --git a/src/Module/Api/Mastodon/Statuses/Favourite.php b/src/Module/Api/Mastodon/Statuses/Favourite.php index ed23891f02..de4c0feec0 100644 --- a/src/Module/Api/Mastodon/Statuses/Favourite.php +++ b/src/Module/Api/Mastodon/Statuses/Favourite.php @@ -49,6 +49,6 @@ class Favourite extends BaseApi Item::performActivity($item['id'], 'like', $uid); - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes())->toArray()); } } diff --git a/src/Module/Api/Mastodon/Statuses/Mute.php b/src/Module/Api/Mastodon/Statuses/Mute.php index f00a7b6d5b..fa6cd120e9 100644 --- a/src/Module/Api/Mastodon/Statuses/Mute.php +++ b/src/Module/Api/Mastodon/Statuses/Mute.php @@ -53,6 +53,6 @@ class Mute extends BaseApi Post\ThreadUser::setIgnored($this->parameters['id'], $uid, true); - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes())->toArray()); } } diff --git a/src/Module/Api/Mastodon/Statuses/Pin.php b/src/Module/Api/Mastodon/Statuses/Pin.php index b5eb619d1e..aa692c6b76 100644 --- a/src/Module/Api/Mastodon/Statuses/Pin.php +++ b/src/Module/Api/Mastodon/Statuses/Pin.php @@ -48,6 +48,6 @@ class Pin extends BaseApi Post\Collection::add($this->parameters['id'], Post\Collection::FEATURED, $item['author-id'], $uid); - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes())->toArray()); } } diff --git a/src/Module/Api/Mastodon/Statuses/Reblog.php b/src/Module/Api/Mastodon/Statuses/Reblog.php index 631f3e8fe1..254144df98 100644 --- a/src/Module/Api/Mastodon/Statuses/Reblog.php +++ b/src/Module/Api/Mastodon/Statuses/Reblog.php @@ -58,6 +58,6 @@ class Reblog extends BaseApi Item::performActivity($item['id'], 'announce', $uid); } - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes())->toArray()); } } diff --git a/src/Module/Api/Mastodon/Statuses/Unbookmark.php b/src/Module/Api/Mastodon/Statuses/Unbookmark.php index d49a661367..dd6a59fed2 100644 --- a/src/Module/Api/Mastodon/Statuses/Unbookmark.php +++ b/src/Module/Api/Mastodon/Statuses/Unbookmark.php @@ -65,6 +65,6 @@ class Unbookmark extends BaseApi Item::update(['starred' => false], ['id' => $item['id']]); - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes())->toArray()); } } diff --git a/src/Module/Api/Mastodon/Statuses/Unfavourite.php b/src/Module/Api/Mastodon/Statuses/Unfavourite.php index a096ed7d6a..06b5c6c615 100644 --- a/src/Module/Api/Mastodon/Statuses/Unfavourite.php +++ b/src/Module/Api/Mastodon/Statuses/Unfavourite.php @@ -49,6 +49,6 @@ class Unfavourite extends BaseApi Item::performActivity($item['id'], 'unlike', $uid); - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes())->toArray()); } } diff --git a/src/Module/Api/Mastodon/Statuses/Unmute.php b/src/Module/Api/Mastodon/Statuses/Unmute.php index ed700eeb01..658b6be8ba 100644 --- a/src/Module/Api/Mastodon/Statuses/Unmute.php +++ b/src/Module/Api/Mastodon/Statuses/Unmute.php @@ -53,6 +53,6 @@ class Unmute extends BaseApi Post\ThreadUser::setIgnored($this->parameters['id'], $uid, false); - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes())->toArray()); } } diff --git a/src/Module/Api/Mastodon/Statuses/Unpin.php b/src/Module/Api/Mastodon/Statuses/Unpin.php index 61df4a2dbb..f9efcdee66 100644 --- a/src/Module/Api/Mastodon/Statuses/Unpin.php +++ b/src/Module/Api/Mastodon/Statuses/Unpin.php @@ -48,6 +48,6 @@ class Unpin extends BaseApi Post\Collection::remove($this->parameters['id'], Post\Collection::FEATURED, $uid); - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes())->toArray()); } } diff --git a/src/Module/Api/Mastodon/Statuses/Unreblog.php b/src/Module/Api/Mastodon/Statuses/Unreblog.php index d9c21be373..94de3e9c6a 100644 --- a/src/Module/Api/Mastodon/Statuses/Unreblog.php +++ b/src/Module/Api/Mastodon/Statuses/Unreblog.php @@ -64,6 +64,6 @@ class Unreblog extends BaseApi Item::performActivity($item['id'], 'unannounce', $uid); } - System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid)->toArray()); + System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, self::appSupportsQuotes())->toArray()); } } diff --git a/src/Module/Api/Mastodon/Timelines/Home.php b/src/Module/Api/Mastodon/Timelines/Home.php index a9a01a813c..a72957b9d8 100644 --- a/src/Module/Api/Mastodon/Timelines/Home.php +++ b/src/Module/Api/Mastodon/Timelines/Home.php @@ -91,10 +91,12 @@ class Home extends BaseApi $items = Post::selectForUser($uid, ['uri-id'], $condition, $params); + $display_quotes = self::appSupportsQuotes(); + $statuses = []; while ($item = Post::fetch($items)) { self::setBoundaries($item['uri-id']); - $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); + $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, $display_quotes); } DBA::close($items); diff --git a/src/Module/Api/Mastodon/Timelines/ListTimeline.php b/src/Module/Api/Mastodon/Timelines/ListTimeline.php index dbfa277f72..83ab204e7b 100644 --- a/src/Module/Api/Mastodon/Timelines/ListTimeline.php +++ b/src/Module/Api/Mastodon/Timelines/ListTimeline.php @@ -96,10 +96,12 @@ class ListTimeline extends BaseApi $items = Post::selectForUser($uid, ['uri-id'], $condition, $params); + $display_quotes = self::appSupportsQuotes(); + $statuses = []; while ($item = Post::fetch($items)) { self::setBoundaries($item['uri-id']); - $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); + $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, $display_quotes); } DBA::close($items); diff --git a/src/Module/Api/Mastodon/Timelines/PublicTimeline.php b/src/Module/Api/Mastodon/Timelines/PublicTimeline.php index 9aeb54e084..083d9867ed 100644 --- a/src/Module/Api/Mastodon/Timelines/PublicTimeline.php +++ b/src/Module/Api/Mastodon/Timelines/PublicTimeline.php @@ -97,11 +97,13 @@ class PublicTimeline extends BaseApi $items = Post::selectPostsForUser($uid, ['uri-id'], $condition, $params); + $display_quotes = self::appSupportsQuotes(); + $statuses = []; while ($item = Post::fetch($items)) { self::setBoundaries($item['uri-id']); try { - $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); + $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, $display_quotes); } catch (\Throwable $th) { Logger::info('Post not fetchable', ['uri-id' => $item['uri-id'], 'uid' => $uid, 'error' => $th]); } diff --git a/src/Module/Api/Mastodon/Timelines/Tag.php b/src/Module/Api/Mastodon/Timelines/Tag.php index dea8aee5af..c5a06e28c2 100644 --- a/src/Module/Api/Mastodon/Timelines/Tag.php +++ b/src/Module/Api/Mastodon/Timelines/Tag.php @@ -105,10 +105,12 @@ class Tag extends BaseApi $items = DBA::select('tag-search-view', ['uri-id'], $condition, $params); + $display_quotes = self::appSupportsQuotes(); + $statuses = []; while ($item = Post::fetch($items)) { self::setBoundaries($item['uri-id']); - $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); + $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, $display_quotes); } DBA::close($items); diff --git a/src/Module/Api/Mastodon/Trends/Statuses.php b/src/Module/Api/Mastodon/Trends/Statuses.php index f9411465c6..7fad480cb0 100644 --- a/src/Module/Api/Mastodon/Trends/Statuses.php +++ b/src/Module/Api/Mastodon/Trends/Statuses.php @@ -48,10 +48,12 @@ class Statuses extends BaseApi $condition = ["NOT `private` AND `commented` > ? AND `created` > ?", DateTimeFormat::utc('now -1 day'), DateTimeFormat::utc('now -1 week')]; $condition = DBA::mergeConditions($condition, ['network' => Protocol::FEDERATED]); + $display_quotes = self::appSupportsQuotes(); + $trending = []; $statuses = Post::selectPostThread(['uri-id'], $condition, ['limit' => $request['limit'], 'order' => ['total-actors' => true]]); while ($status = Post::fetch($statuses)) { - $trending[] = DI::mstdnStatus()->createFromUriId($status['uri-id'], $uid); + $trending[] = DI::mstdnStatus()->createFromUriId($status['uri-id'], $uid, $display_quotes); } DBA::close($statuses); diff --git a/src/Module/BaseApi.php b/src/Module/BaseApi.php index 29ca755e05..6a41198473 100644 --- a/src/Module/BaseApi.php +++ b/src/Module/BaseApi.php @@ -180,6 +180,17 @@ class BaseApi extends BaseModule } } + /** + * Check if the app is known to support quoted posts + * + * @return bool + */ + public static function appSupportsQuotes(): bool + { + $token = self::getCurrentApplication(); + return (!empty($token['name']) && in_array($token['name'], ['Fedilab'])); + } + /** * Get current application token *