. * * @category Plugin * @package GNUsocial * @author Diogo Cordeiro * @author Daniel Supernault * @copyright 2018 Free Software Foundation http://fsf.org * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link https://www.gnu.org/software/social/ */ if (!defined ('GNUSOCIAL')) { exit(1); } /** * @category Plugin * @package GNUsocial * @author Diogo Cordeiro * @author Daniel Supernault * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://www.gnu.org/software/social/ */ class apActorFollowersAction extends ManagedAction { protected $needLogin = false; protected $canPost = true; /** * Handle the Followers Collection request * * @return void */ protected function handle () { $nickname = $this->trimmed ('nickname'); try { $user = User::getByNickname ($nickname); $profile = $user->getProfile (); $url = $profile->profileurl; } catch (Exception $e) { ActivityPubReturn::error ('Invalid username'); } $page = intval ($this->trimmed ('page')); if ($page <= 0) { ActivityPubReturn::error ('Invalid page number'); } /* Fetch Followers */ try { $since = ($page - 1) * PROFILES_PER_MINILIST; $limit = (($page - 1) == 0 ? 1 : $page) * PROFILES_PER_MINILIST; $sub = $profile->getSubscribers ($since, $limit); } catch(NoResultException $e) { ActivityPubReturn::error ('This user has no followers'); } /* Calculate total items */ $total_subs = $profile->subscriberCount (); $total_pages = ceil ($total_subs / PROFILES_PER_MINILIST); if ($total_pages == 0) { ActivityPubReturn::error ('This user has no followers'); } if ($page > $total_pages) { ActivityPubReturn::error ("There are only {$total_pages} pages"); } /* Get followers' URLs */ $subs = array (); while ($sub->fetch ()) { $subs[] = $sub->profileurl; } $res = [ '@context' => [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1", ], 'id' => "{$url}/followers.json", 'type' => ($page == 0 ? 'OrderedCollection' : 'OrderedCollectionPage'), 'totalItems' => $total_subs, 'next' => $page+1 > $total_pages ? null : "{$url}/followers.json?page=".($page+1 == 1 ? 2 : $page+1), 'prev' => $page == 1 ? null : "{$url}/followers.json?page=".($page-1 <= 0 ? 1 : $page-1), 'orderedItems' => $subs ]; ActivityPubReturn::answer ($res); } }