diff --git a/ActivityPubPlugin.php b/ActivityPubPlugin.php index 187cec4..a95a008 100644 --- a/ActivityPubPlugin.php +++ b/ActivityPubPlugin.php @@ -52,9 +52,9 @@ class ActivityPubPlugin extends Plugin ['action' => 'apActorFollowers'], ['nickname' => Nickname::DISPLAY_FMT]); - /*$m->connect(':nickname/following.json', + $m->connect(':nickname/following.json', ['action' => 'apActorFollowing'], - ['nickname' => Nickname::DISPLAY_FMT]);*/ + ['nickname' => Nickname::DISPLAY_FMT]); } public function onPluginVersion(array &$versions) diff --git a/actions/apactorfollowing.php b/actions/apactorfollowing.php new file mode 100644 index 0000000..43196c3 --- /dev/null +++ b/actions/apactorfollowing.php @@ -0,0 +1,100 @@ +. + * + * @category Plugin + * @package GNUsocial + * @author Diogo Cordeiro + * @author Daniel Supernault + * @copyright 2015 Free Software Foundaction, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link https://gnu.io/social + */ + +if (!defined('GNUSOCIAL')) { exit(1); } + +class apActorFollowingAction extends ManagedAction +{ + protected $needLogin = false; + protected $canPost = true; + + protected function handle() + { + $nickname = $this->trimmed('nickname'); + try { + $user = User::getByNickname($nickname); + $profile = $user->getProfile(); + $url = $profile->profileurl; + } catch (Exception $e) { + throw new \Exception('Invalid username'); + } + + $page = intval($this->trimmed('page')); + + if ($page <= 0) + throw new \Exception('Invalid page number'); + + /* Fetch Following */ + try { + $since = ($page-1) * PROFILES_PER_MINILIST; + $limit = (($page-1) == 0 ? 1 : $page)*PROFILES_PER_MINILIST; + $sub = $profile->getSubscribed($since, $limit); + } catch (NoResultException $e) { + throw new \Exception('This user is not following anyone'); + } + + /* Calculate total items */ + $total_subs = $profile->subscriptionCount(); + $total_pages = ceil($total_subs/PROFILES_PER_MINILIST); + + if ($total_pages == 0) + throw new \Exception('This user has no followers'); + + if ($page > $total_pages) + throw new \Exception("There are only {$total_pages} pages"); + + /* Get followed' URLs */ + $subs = []; + while ($sub->fetch()) + $subs[] = $this->pretty_sub (clone($sub)); + + $res = [ + '@context' => [ + "https://www.w3.org/ns/activitystreams", + "https://w3id.org/security/v1", + ], + 'id' => "{$url}/following.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 + ]; + + header('Content-Type: application/activity+json'); + + echo json_encode($res, JSON_UNESCAPED_SLASHES | (isset($_GET["pretty"]) ? JSON_PRETTY_PRINT : null)); + } + + protected function pretty_sub ($sub_object) + { + return $sub_object->profileurl; + } +}