X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FApi%2FMastodon%2FStatuses%2FContext.php;h=6e35d717bf741d09bec7f51937beea1b1ff8edaa;hb=1b9ec3a2147fc10e4037ff1b2a7aac506cdf3b13;hp=03782ef1ce4d44df115b3f262884d35abb5c45c8;hpb=587953582273326dfa1ff744827897e1bf1208c9;p=friendica.git diff --git a/src/Module/Api/Mastodon/Statuses/Context.php b/src/Module/Api/Mastodon/Statuses/Context.php index 03782ef1ce..6e35d717bf 100644 --- a/src/Module/Api/Mastodon/Statuses/Context.php +++ b/src/Module/Api/Mastodon/Statuses/Context.php @@ -1,6 +1,6 @@ parameters['id'])) { - DI::mstdnError()->UnprocessableEntity(); + $this->logAndJsonError(422, $this->errorFactory->UnprocessableEntity()); } - $request = self::getRequest([ - 'limit' => 40, // Maximum number of results to return. Defaults to 40. - ]); + $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. + 'show_all' => false, // shows posts for all users including blocked and ignored users + ], $request); $id = $this->parameters['id']; $parents = []; $children = []; + $deleted = []; - $parent = Post::selectFirst(['parent-uri-id'], ['uri-id' => $id]); + $parent = Post::selectOriginal(['uri-id', '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' => [GRAVITY_PARENT, GRAVITY_COMMENT]]); + $id = $parent['uri-id']; + $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']; + } + + if (!empty($uid) && !$request['show_all']) { + $condition = DBA::mergeConditions( + $condition, + ["NOT `author-id` IN (SELECT `cid` FROM `user-contact` WHERE `uid` = ? AND (`blocked` OR `ignored`))", $uid] + ); + } + + $posts = Post::selectPosts(['uri-id', 'thr-parent-id', 'deleted'], $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']; + + if ($post['deleted']) { + $deleted[] = $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)) { @@ -79,29 +116,31 @@ class Context extends BaseApi } DBA::close($posts); } else { - DI::mstdnError()->RecordNotFound(); + $this->logAndJsonError(404, $this->errorFactory->RecordNotFound()); } } $statuses = ['ancestors' => [], 'descendants' => []]; - $ancestors = self::getParents($id, $parents); + $ancestors = array_diff(self::getParents($id, $parents), $deleted); 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); + $descendants = array_diff(self::getChildren($id, $children), $deleted); 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); + $this->jsonExit($statuses); } private static function getParents(int $id, array $parents, array $list = [])