X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FApi%2FMastodon%2FStatuses%2FContext.php;h=6e35d717bf741d09bec7f51937beea1b1ff8edaa;hb=1b9ec3a2147fc10e4037ff1b2a7aac506cdf3b13;hp=112ae857c6830b245e78912f5ad7f253f72c9043;hpb=86d56c7f5745306a1983c366d5b5b4084a58e12b;p=friendica.git diff --git a/src/Module/Api/Mastodon/Statuses/Context.php b/src/Module/Api/Mastodon/Statuses/Context.php index 112ae857c6..6e35d717bf 100644 --- a/src/Module/Api/Mastodon/Statuses/Context.php +++ b/src/Module/Api/Mastodon/Statuses/Context.php @@ -1,6 +1,6 @@ UnprocessableEntity(); + if (empty($this->parameters['id'])) { + $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 = $parameters['id']; - - $parent = Post::selectFirst(['parent-uri-id'], ['uri-id' => $id]); - if (!DBA::isResult($parent)) { - DI::mstdnError()->RecordNotFound(); - } + $id = $this->parameters['id']; $parents = []; $children = []; + $deleted = []; + + $parent = Post::selectOriginal(['uri-id', 'parent-uri-id'], ['uri-id' => $id]); + if (DBA::isResult($parent)) { + $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']]); + } - $posts = Post::select(['uri-id', 'thr-parent-id'], - ['parent-uri-id' => $parent['parent-uri-id'], 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT]], [], false); - while ($post = Post::fetch($posts)) { - if ($post['uri-id'] == $post['thr-parent-id']) { - continue; + if (!empty($request['min_id'])) { + $condition = DBA::mergeConditions($condition, ["`uri-id` > ?", $request['min_id']]); + $params['order'] = ['uri-id']; } - $parents[$post['uri-id']] = $post['thr-parent-id']; - $children[$post['thr-parent-id']][] = $post['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)) { + $posts = DBA::select('mail', ['uri-id', 'thr-parent-id'], ['parent-uri-id' => $parent['parent-uri-id']]); + while ($post = DBA::fetch($posts)) { + if ($post['uri-id'] == $post['thr-parent-id']) { + continue; + } + $parents[$post['uri-id']] = $post['thr-parent-id']; + + $children[$post['thr-parent-id']][] = $post['uri-id']; + } + DBA::close($posts); + } else { + $this->logAndJsonError(404, $this->errorFactory->RecordNotFound()); + } } - DBA::close($posts); $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 = [])