API: added positiv list for quote support

This commit is contained in:
Michael 2023-01-25 06:26:17 +00:00
parent a86fbe37c9
commit 49d513f8d2
23 changed files with 114 additions and 55 deletions

View File

@ -198,6 +198,20 @@ class Status extends BaseFactory
$poll = null; $poll = null;
} }
if ($display_quote) {
$quote = self::createQuote($item, $uid);
$item['body'] = BBCode::removeSharedData($item['body']);
if (!is_null($item['raw-body'])) {
$item['raw-body'] = BBCode::removeSharedData($item['raw-body']);
}
} else {
// 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);
}
$shared = $this->contentItem->getSharedPost($item, ['uri-id']); $shared = $this->contentItem->getSharedPost($item, ['uri-id']);
if (!empty($shared)) { if (!empty($shared)) {
$shared_uri_id = $shared['post']['uri-id']; $shared_uri_id = $shared['post']['uri-id'];
@ -225,20 +239,6 @@ class Status extends BaseFactory
} }
} }
if ($display_quote) {
$quote = self::createQuote($item, $uid);
$item['body'] = BBCode::removeSharedData($item['body']);
if (!is_null($item['raw-body'])) {
$item['raw-body'] = BBCode::removeSharedData($item['raw-body']);
}
} else {
// 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);
}
$item['body'] = $this->contentItem->addSharedPost($item); $item['body'] = $this->contentItem->addSharedPost($item);
if (!is_null($item['raw-body'])) { if (!is_null($item['raw-body'])) {

View File

@ -113,11 +113,13 @@ class Statuses extends BaseApi
$items = Post::selectForUser($uid, ['uri-id'], $condition, $params); $items = Post::selectForUser($uid, ['uri-id'], $condition, $params);
} }
$display_quotes = self::appSupportsQuotes();
$statuses = []; $statuses = [];
while ($item = Post::fetch($items)) { while ($item = Post::fetch($items)) {
self::setBoundaries($item['uri-id']); self::setBoundaries($item['uri-id']);
try { try {
$statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, true, true, $display_quotes);
} catch (\Throwable $th) { } catch (\Throwable $th) {
Logger::info('Post not fetchable', ['uri-id' => $item['uri-id'], 'uid' => $uid, 'error' => $th]); Logger::info('Post not fetchable', ['uri-id' => $item['uri-id'], 'uid' => $uid, 'error' => $th]);
} }

View File

@ -69,10 +69,12 @@ class Bookmarks extends BaseApi
$items = Post::selectThreadForUser($uid, ['uri-id'], $condition, $params); $items = Post::selectThreadForUser($uid, ['uri-id'], $condition, $params);
$display_quotes = self::appSupportsQuotes();
$statuses = []; $statuses = [];
while ($item = Post::fetch($items)) { while ($item = Post::fetch($items)) {
self::setBoundaries($item['uri-id']); self::setBoundaries($item['uri-id']);
$statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, true, true, $display_quotes);
} }
DBA::close($items); DBA::close($items);

View File

@ -45,8 +45,9 @@ class Favourited extends BaseApi
$request = $this->getRequest([ $request = $this->getRequest([
'limit' => 20, // Maximum number of results to return. Defaults to 20. '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 '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. 'with_muted' => false, // Pleroma extension: return activities by muted (not by blocked!) users.
], $request); ], $request);
@ -58,6 +59,10 @@ class Favourited extends BaseApi
$condition = DBA::mergeConditions($condition, ["`thr-parent-id` < ?", $request['max_id']]); $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'])) { if (!empty($request['min_id'])) {
$condition = DBA::mergeConditions($condition, ["`thr-parent-id` > ?", $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); $items = Post::selectForUser($uid, ['thr-parent-id'], $condition, $params);
$display_quotes = self::appSupportsQuotes();
$statuses = []; $statuses = [];
while ($item = Post::fetch($items)) { while ($item = Post::fetch($items)) {
self::setBoundaries($item['thr-parent-id']); self::setBoundaries($item['thr-parent-id']);
$statuses[] = DI::mstdnStatus()->createFromUriId($item['thr-parent-id'], $uid); $statuses[] = DI::mstdnStatus()->createFromUriId($item['thr-parent-id'], $uid, true, true, $display_quotes);
} }
DBA::close($items); DBA::close($items);

View File

@ -142,7 +142,7 @@ class Search extends BaseApi
// If the user-specific search failed, we search and probe a public post // If the user-specific search failed, we search and probe a public post
$item_id = Item::fetchByLink($q, $uid) ?: Item::fetchByLink($q); $item_id = Item::fetchByLink($q, $uid) ?: Item::fetchByLink($q);
if ($item_id && $item = Post::selectFirst(['uri-id'], ['id' => $item_id])) { 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, true, true, self::appSupportsQuotes());
} }
} }
@ -176,10 +176,12 @@ class Search extends BaseApi
$items = DBA::select($table, ['uri-id'], $condition, $params); $items = DBA::select($table, ['uri-id'], $condition, $params);
$display_quotes = self::appSupportsQuotes();
$statuses = []; $statuses = [];
while ($item = Post::fetch($items)) { while ($item = Post::fetch($items)) {
self::setBoundaries($item['uri-id']); self::setBoundaries($item['uri-id']);
$statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, true, true, $display_quotes);
} }
DBA::close($items); DBA::close($items);

View File

@ -88,7 +88,7 @@ class Statuses extends BaseApi
Item::update($item, ['id' => $post['id']]); Item::update($item, ['id' => $post['id']]);
Item::updateDisplayCache($post['uri-id']); Item::updateDisplayCache($post['uri-id']);
System::jsonExit(DI::mstdnStatus()->createFromUriId($post['uri-id'], $uid)); System::jsonExit(DI::mstdnStatus()->createFromUriId($post['uri-id'], $uid, true, true, self::appSupportsQuotes()));
} }
protected function post(array $request = []) protected function post(array $request = [])
@ -269,7 +269,7 @@ class Statuses extends BaseApi
if (!empty($id)) { if (!empty($id)) {
$item = Post::selectFirst(['uri-id'], ['id' => $id]); $item = Post::selectFirst(['uri-id'], ['id' => $id]);
if (!empty($item['uri-id'])) { if (!empty($item['uri-id'])) {
System::jsonExit(DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid)); System::jsonExit(DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, true, true, self::appSupportsQuotes()));
} }
} }
@ -308,7 +308,7 @@ class Statuses extends BaseApi
DI::mstdnError()->UnprocessableEntity(); DI::mstdnError()->UnprocessableEntity();
} }
System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, false)); System::jsonExit(DI::mstdnStatus()->createFromUriId($this->parameters['id'], $uid, false, true, self::appSupportsQuotes()));
} }
private function getApp(): string private function getApp(): string

View File

@ -65,6 +65,6 @@ class Bookmark extends BaseApi
Item::update(['starred' => true], ['id' => $item['id']]); 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, true, true, self::appSupportsQuotes())->toArray());
} }
} }

View File

@ -45,6 +45,9 @@ class Context extends BaseApi
} }
$request = $this->getRequest([ $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. 'limit' => 40, // Maximum number of results to return. Defaults to 40.
], $request); ], $request);
@ -55,17 +58,36 @@ class Context extends BaseApi
$parent = Post::selectFirst(['parent-uri-id'], ['uri-id' => $id]); $parent = Post::selectFirst(['parent-uri-id'], ['uri-id' => $id]);
if (DBA::isResult($parent)) { if (DBA::isResult($parent)) {
$posts = Post::selectPosts(['uri-id', 'thr-parent-id'], $params = ['order' => ['uri-id' => true]];
['parent-uri-id' => $parent['parent-uri-id'], 'gravity' => [Item::GRAVITY_PARENT, Item::GRAVITY_COMMENT]]); $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)) { while ($post = Post::fetch($posts)) {
if ($post['uri-id'] == $post['thr-parent-id']) { if ($post['uri-id'] == $post['thr-parent-id']) {
continue; continue;
} }
self::setBoundaries($post['uri-id']);
$parents[$post['uri-id']] = $post['thr-parent-id']; $parents[$post['uri-id']] = $post['thr-parent-id'];
$children[$post['thr-parent-id']][] = $post['uri-id']; $children[$post['thr-parent-id']][] = $post['uri-id'];
} }
DBA::close($posts); DBA::close($posts);
self::setLinkHeader();
} else { } else {
$parent = DBA::selectFirst('mail', ['parent-uri-id'], ['uri-id' => $id, 'uid' => $uid]); $parent = DBA::selectFirst('mail', ['parent-uri-id'], ['uri-id' => $id, 'uid' => $uid]);
if (DBA::isResult($parent)) { if (DBA::isResult($parent)) {
@ -90,8 +112,10 @@ class Context extends BaseApi
asort($ancestors); asort($ancestors);
$display_quotes = self::appSupportsQuotes();
foreach (array_slice($ancestors, 0, $request['limit']) as $ancestor) { foreach (array_slice($ancestors, 0, $request['limit']) as $ancestor) {
$statuses['ancestors'][] = DI::mstdnStatus()->createFromUriId($ancestor, $uid);; $statuses['ancestors'][] = DI::mstdnStatus()->createFromUriId($ancestor, $uid, true, true, $display_quotes);;
} }
$descendants = self::getChildren($id, $children); $descendants = self::getChildren($id, $children);
@ -99,7 +123,7 @@ class Context extends BaseApi
asort($descendants); asort($descendants);
foreach (array_slice($descendants, 0, $request['limit']) as $descendant) { foreach (array_slice($descendants, 0, $request['limit']) as $descendant) {
$statuses['descendants'][] = DI::mstdnStatus()->createFromUriId($descendant, $uid); $statuses['descendants'][] = DI::mstdnStatus()->createFromUriId($descendant, $uid, true, true, $display_quotes);
} }
System::jsonExit($statuses); System::jsonExit($statuses);

View File

@ -49,6 +49,6 @@ class Favourite extends BaseApi
Item::performActivity($item['id'], 'like', $uid); 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,true, true, self::appSupportsQuotes())->toArray());
} }
} }

View File

@ -53,6 +53,6 @@ class Mute extends BaseApi
Post\ThreadUser::setIgnored($this->parameters['id'], $uid, true); 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, true, true, self::appSupportsQuotes())->toArray());
} }
} }

View File

@ -48,6 +48,6 @@ class Pin extends BaseApi
Post\Collection::add($this->parameters['id'], Post\Collection::FEATURED, $item['author-id'], $uid); 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, true, true, self::appSupportsQuotes())->toArray());
} }
} }

View File

@ -58,6 +58,6 @@ class Reblog extends BaseApi
Item::performActivity($item['id'], 'announce', $uid); 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, true, true, self::appSupportsQuotes())->toArray());
} }
} }

View File

@ -65,6 +65,6 @@ class Unbookmark extends BaseApi
Item::update(['starred' => false], ['id' => $item['id']]); 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, true, true, self::appSupportsQuotes())->toArray());
} }
} }

View File

@ -49,6 +49,6 @@ class Unfavourite extends BaseApi
Item::performActivity($item['id'], 'unlike', $uid); 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, true, true, self::appSupportsQuotes())->toArray());
} }
} }

View File

@ -53,6 +53,6 @@ class Unmute extends BaseApi
Post\ThreadUser::setIgnored($this->parameters['id'], $uid, false); 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, true, true, self::appSupportsQuotes())->toArray());
} }
} }

View File

@ -48,6 +48,6 @@ class Unpin extends BaseApi
Post\Collection::remove($this->parameters['id'], Post\Collection::FEATURED, $uid); 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, true, true, self::appSupportsQuotes())->toArray());
} }
} }

View File

@ -64,6 +64,6 @@ class Unreblog extends BaseApi
Item::performActivity($item['id'], 'unannounce', $uid); 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, true, true, self::appSupportsQuotes())->toArray());
} }
} }

View File

@ -21,6 +21,7 @@
namespace Friendica\Module\Api\Mastodon\Timelines; namespace Friendica\Module\Api\Mastodon\Timelines;
use Friendica\Core\Logger;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\DI; use Friendica\DI;
@ -91,10 +92,12 @@ class Home extends BaseApi
$items = Post::selectForUser($uid, ['uri-id'], $condition, $params); $items = Post::selectForUser($uid, ['uri-id'], $condition, $params);
$display_quotes = self::appSupportsQuotes();
$statuses = []; $statuses = [];
while ($item = Post::fetch($items)) { while ($item = Post::fetch($items)) {
self::setBoundaries($item['uri-id']); self::setBoundaries($item['uri-id']);
$statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, true, true, $display_quotes);
} }
DBA::close($items); DBA::close($items);

View File

@ -96,10 +96,12 @@ class ListTimeline extends BaseApi
$items = Post::selectForUser($uid, ['uri-id'], $condition, $params); $items = Post::selectForUser($uid, ['uri-id'], $condition, $params);
$display_quotes = self::appSupportsQuotes();
$statuses = []; $statuses = [];
while ($item = Post::fetch($items)) { while ($item = Post::fetch($items)) {
self::setBoundaries($item['uri-id']); self::setBoundaries($item['uri-id']);
$statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, true, true, $display_quotes);
} }
DBA::close($items); DBA::close($items);

View File

@ -97,11 +97,13 @@ class PublicTimeline extends BaseApi
$items = Post::selectPostsForUser($uid, ['uri-id'], $condition, $params); $items = Post::selectPostsForUser($uid, ['uri-id'], $condition, $params);
$display_quotes = self::appSupportsQuotes();
$statuses = []; $statuses = [];
while ($item = Post::fetch($items)) { while ($item = Post::fetch($items)) {
self::setBoundaries($item['uri-id']); self::setBoundaries($item['uri-id']);
try { try {
$statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, true, true, $display_quotes);
} catch (\Throwable $th) { } catch (\Throwable $th) {
Logger::info('Post not fetchable', ['uri-id' => $item['uri-id'], 'uid' => $uid, 'error' => $th]); Logger::info('Post not fetchable', ['uri-id' => $item['uri-id'], 'uid' => $uid, 'error' => $th]);
} }

View File

@ -105,10 +105,12 @@ class Tag extends BaseApi
$items = DBA::select('tag-search-view', ['uri-id'], $condition, $params); $items = DBA::select('tag-search-view', ['uri-id'], $condition, $params);
$display_quotes = self::appSupportsQuotes();
$statuses = []; $statuses = [];
while ($item = Post::fetch($items)) { while ($item = Post::fetch($items)) {
self::setBoundaries($item['uri-id']); self::setBoundaries($item['uri-id']);
$statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid); $statuses[] = DI::mstdnStatus()->createFromUriId($item['uri-id'], $uid, true, true, $display_quotes);
} }
DBA::close($items); DBA::close($items);

View File

@ -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 = ["NOT `private` AND `commented` > ? AND `created` > ?", DateTimeFormat::utc('now -1 day'), DateTimeFormat::utc('now -1 week')];
$condition = DBA::mergeConditions($condition, ['network' => Protocol::FEDERATED]); $condition = DBA::mergeConditions($condition, ['network' => Protocol::FEDERATED]);
$display_quotes = self::appSupportsQuotes();
$trending = []; $trending = [];
$statuses = Post::selectPostThread(['uri-id'], $condition, ['limit' => $request['limit'], 'order' => ['total-actors' => true]]); $statuses = Post::selectPostThread(['uri-id'], $condition, ['limit' => $request['limit'], 'order' => ['total-actors' => true]]);
while ($status = Post::fetch($statuses)) { while ($status = Post::fetch($statuses)) {
$trending[] = DI::mstdnStatus()->createFromUriId($status['uri-id'], $uid); $trending[] = DI::mstdnStatus()->createFromUriId($status['uri-id'], $uid, true, true, $display_quotes);
} }
DBA::close($statuses); DBA::close($statuses);

View File

@ -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 * Get current application token
* *