X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FApi%2FMastodon%2FFollowRequests.php;h=fc384f79793d959b0aa787ed9150cef47bfb82a9;hb=7db4c7ea02cdf2c5a1a6e6314aebf206ca25319f;hp=515dc451cdcb947d412d67931684155016d54197;hpb=8016cb3ceeff134896464faa1ab5f2d60ad8a6fd;p=friendica.git diff --git a/src/Module/Api/Mastodon/FollowRequests.php b/src/Module/Api/Mastodon/FollowRequests.php index 515dc451cd..fc384f7979 100644 --- a/src/Module/Api/Mastodon/FollowRequests.php +++ b/src/Module/Api/Mastodon/FollowRequests.php @@ -2,16 +2,16 @@ namespace Friendica\Module\Api\Mastodon; -use Friendica\Api\Mastodon\Account; -use Friendica\App\BaseURL; +use Friendica\Api\Entity\Mastodon; +use Friendica\Api\Entity\Mastodon\Relationship; use Friendica\Core\System; -use Friendica\Database\DBA; +use Friendica\DI; use Friendica\Model\Contact; use Friendica\Module\Base\Api; use Friendica\Network\HTTPException; /** - * @see https://docs.joinmastodon.org/api/rest/follow-requests/ + * @see https://docs.joinmastodon.org/methods/accounts/follow_requests */ class FollowRequests extends Api { @@ -19,13 +19,59 @@ class FollowRequests extends Api { parent::init($parameters); - self::login(); + if (!self::login()) { + throw new HTTPException\UnauthorizedException(); + } } /** * @param array $parameters + * @throws HTTPException\BadRequestException + * @throws HTTPException\ForbiddenException * @throws HTTPException\InternalServerErrorException - * @see https://docs.joinmastodon.org/api/rest/follow-requests/#get-api-v1-follow-requests + * @throws HTTPException\NotFoundException + * @throws HTTPException\UnauthorizedException + * @throws \ImagickException + * + * @see https://docs.joinmastodon.org/methods/accounts/follow_requests#accept-follow + * @see https://docs.joinmastodon.org/methods/accounts/follow_requests#reject-follow + */ + public static function post(array $parameters = []) + { + parent::post($parameters); + + $introduction = DI::intro()->selectFirst(['id' => $parameters['id'], 'uid' => self::$current_user_id]); + + $contactId = $introduction->{'contact-id'}; + + switch ($parameters['action']) { + case 'authorize': + $introduction->confirm(); + + $relationship = DI::mstdnRelationship()->createFromContactId($contactId); + break; + case 'ignore': + $introduction->ignore(); + + $relationship = DI::mstdnRelationship()->createDefaultFromContactId($contactId); + break; + case 'reject': + $introduction->discard(); + + $relationship = DI::mstdnRelationship()->createDefaultFromContactId($contactId); + break; + default: + throw new HTTPException\BadRequestException('Unexpected action parameter, expecting "authorize", "ignore" or "reject"'); + } + + System::jsonExit($relationship); + } + + /** + * @param array $parameters + * @throws HTTPException\InternalServerErrorException + * @throws \ImagickException + * @see https://docs.joinmastodon.org/methods/accounts/follow_requests#pending-follows */ public static function rawContent(array $parameters = []) { @@ -33,29 +79,25 @@ class FollowRequests extends Api $max_id = $_GET['max_id'] ?? null; $limit = intval($_GET['limit'] ?? 40); - if (isset($since_id) && isset($max_id)) { - $condition = ['`uid` = ? AND NOT `self` AND `pending` AND `id` > ? AND `id` < ?', self::$current_user_id, $since_id, $max_id]; - } elseif (isset($since_id)) { - $condition = ['`uid` = ? AND NOT `self` AND `pending` AND `id` > ?', self::$current_user_id, $since_id]; - } elseif (isset($max_id)) { - $condition = ['`uid` = ? AND NOT `self` AND `pending` AND `id` < ?', self::$current_user_id, $max_id]; - } else { - $condition = ['`uid` = ? AND NOT `self` AND `pending`', self::$current_user_id]; - } - - $count = DBA::count('contact', $condition); + $baseUrl = DI::baseUrl(); - $contacts = Contact::selectToArray( - [], - $condition, - ['order' => ['id' => 'DESC'], 'limit' => $limit] + $introductions = DI::intro()->selectByBoundaries( + ['`uid` = ? AND NOT `ignore`', self::$current_user_id], + ['order' => ['id' => 'DESC']], + $since_id, + $max_id, + $limit ); $return = []; - foreach ($contacts as $contact) { - $account = Account::createFromContact($contact); - $return[] = $account; + foreach ($introductions as $key => $introduction) { + try { + $return[] = DI::mstdnFollowRequest()->createFromIntroduction($introduction); + } catch (HTTPException\InternalServerErrorException $exception) { + DI::intro()->delete($introduction); + unset($introductions[$key]); + } } $base_query = []; @@ -63,14 +105,11 @@ class FollowRequests extends Api $base_query['limit'] = $limit; } - /** @var BaseURL $BaseURL */ - $BaseURL = self::getClass(BaseURL::class); - $links = []; - if ($count > $limit) { - $links[] = '<' . $BaseURL->get() . '/api/v1/follow_requests?' . http_build_query($base_query + ['max_id' => $contacts[count($contacts) - 1]['id']]) . '>; rel="next"'; + if ($introductions->getTotalCount() > $limit) { + $links[] = '<' . $baseUrl->get() . '/api/v1/follow_requests?' . http_build_query($base_query + ['max_id' => $introductions[count($introductions) - 1]->id]) . '>; rel="next"'; } - $links[] = '<' . $BaseURL->get() . '/api/v1/follow_requests?' . http_build_query($base_query + ['since_id' => $contacts[0]['id']]) . '>; rel="prev"'; + $links[] = '<' . $baseUrl->get() . '/api/v1/follow_requests?' . http_build_query($base_query + ['since_id' => $introductions[0]->id]) . '>; rel="prev"'; header('Link: ' . implode(', ', $links));