From 2627b54349951eb14b5e3c188f807587ad139ba7 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 7 May 2022 15:52:55 -0400 Subject: [PATCH] Replace dfrn_request by subscribe URL when available for the follow link - Falls back to the `/remote_follow` module available since Friendica version 2020.03 - Falls back to the profile URL - Remove unused atlas dependency in a couple API controllers --- docs/Protocol.md | 4 +++- src/classes/Controllers/Api/MatchSearch.php | 14 +++++++------- src/classes/Controllers/Api/Search.php | 14 +++++++------- src/classes/Controllers/Web/Directory.php | 21 ++++++++++++++++----- src/classes/Controllers/Web/Search.php | 15 +++++++++++++-- src/classes/Models/Profile.php | 10 ++++++++-- src/classes/Models/Server.php | 16 ++++++++++++++++ src/classes/Routes/Http/MatchSearch.php | 1 - src/classes/Routes/Http/Search.php | 1 - src/classes/Routes/Web/Directory.php | 1 + src/classes/Routes/Web/Search.php | 1 + src/templates/sub/profile.phtml | 13 ++++++++----- 12 files changed, 80 insertions(+), 31 deletions(-) diff --git a/docs/Protocol.md b/docs/Protocol.md index 35d397b..f83bf59 100644 --- a/docs/Protocol.md +++ b/docs/Protocol.md @@ -47,7 +47,9 @@ Example: "dfrn_request": "https://friendica.mrpetovan.com/dfrn_request/hypolite", "photo": "https://friendica.mrpetovan.com/photo/27330388315ae4ed2b03e3c116980490-4.jpg?ts=1541567135", "tags": "videogame gaming boardgame politics philosophy development programming php", - "last_activity": "2018-45" + "last_activity": "2018-45", + "remote_follow": "https://friendica.mrpetovan.com/remote_follow/hypolite", + "subscribe": null }, ... ] diff --git a/src/classes/Controllers/Api/MatchSearch.php b/src/classes/Controllers/Api/MatchSearch.php index 28971ae..ba97311 100644 --- a/src/classes/Controllers/Api/MatchSearch.php +++ b/src/classes/Controllers/Api/MatchSearch.php @@ -11,10 +11,6 @@ use Psr\Http\Message\ServerRequestInterface; */ class MatchSearch { - /** - * @var \Atlas\Pdo\Connection - */ - private $atlas; /** * @var \Friendica\Directory\Models\Profile */ @@ -25,12 +21,10 @@ class MatchSearch private $l10n; public function __construct( - \Atlas\Pdo\Connection $atlas, \Friendica\Directory\Models\Profile $profileModel, \Gettext\TranslatorInterface $l10n ) { - $this->atlas = $atlas; $this->profileModel = $profileModel; $this->l10n = $l10n; } @@ -53,7 +47,13 @@ class MatchSearch $values = ['query' => $query]; - $profiles = $this->profileModel->getListForDisplay($pager->getItemsPerPage(), $pager->getStart(), $sql_where, $values); + $profiles = $this->profileModel->getListForDisplay( + null, + $pager->getItemsPerPage(), + $pager->getStart(), + $sql_where, + $values, + ); $results = []; foreach ($profiles as $profile) { diff --git a/src/classes/Controllers/Api/Search.php b/src/classes/Controllers/Api/Search.php index a27fa82..ea39dd7 100644 --- a/src/classes/Controllers/Api/Search.php +++ b/src/classes/Controllers/Api/Search.php @@ -11,10 +11,6 @@ use Psr\Http\Message\ServerRequestInterface; */ class Search { - /** - * @var \Atlas\Pdo\Connection - */ - private $atlas; /** * @var \Friendica\Directory\Models\Profile */ @@ -25,12 +21,10 @@ class Search private $l10n; public function __construct( - \Atlas\Pdo\Connection $atlas, \Friendica\Directory\Models\Profile $profileModel, \Gettext\TranslatorInterface $l10n ) { - $this->atlas = $atlas; $this->profileModel = $profileModel; $this->l10n = $l10n; } @@ -64,7 +58,13 @@ AND `account_type` = :account_type'; $values['account_type'] = $account_type; } - $profiles = $this->profileModel->getListForDisplay($pager->getItemsPerPage(), $pager->getStart(), $sql_where, $values); + $profiles = $this->profileModel->getListForDisplay( + null, + $pager->getItemsPerPage(), + $pager->getStart(), + $sql_where, + $values, + ); $count = $this->profileModel->getCountForDisplay($sql_where, $values); diff --git a/src/classes/Controllers/Web/Directory.php b/src/classes/Controllers/Web/Directory.php index f4aaaec..84c5a1f 100644 --- a/src/classes/Controllers/Web/Directory.php +++ b/src/classes/Controllers/Web/Directory.php @@ -18,6 +18,10 @@ class Directory extends BaseController * @var \Atlas\Pdo\Connection */ private $atlas; + /** + * @var \Friendica\Directory\Models\Server + */ + private $serverModel; /** * @var \Friendica\Directory\Models\Profile */ @@ -37,6 +41,7 @@ class Directory extends BaseController public function __construct( \Atlas\Pdo\Connection $atlas, + \Friendica\Directory\Models\Server $serverModel, \Friendica\Directory\Models\Profile $profileModel, \Friendica\Directory\Views\Widget\AccountTypeTabs $accountTypeTabs, \Friendica\Directory\Views\PhpRenderer $renderer, @@ -44,6 +49,7 @@ class Directory extends BaseController ) { $this->atlas = $atlas; + $this->serverModel = $serverModel; $this->profileModel = $profileModel; $this->accountTypeTabs = $accountTypeTabs; $this->renderer = $renderer; @@ -58,16 +64,22 @@ class Directory extends BaseController $pager = new Pager($this->l10n, $request, 20); - $condition = ''; + $sql_where = ''; $values = []; if (!empty($args['account_type'])) { - $condition = '`account_type` = :account_type'; + $sql_where = '`account_type` = :account_type'; $values = ['account_type' => $args['account_type']]; } - $profiles = $this->profileModel->getListForDisplay($pager->getItemsPerPage(), $pager->getStart(), $condition, $values); + $profiles = $this->profileModel->getListForDisplay( + $this->serverModel->getSubscribeUrlByProfile($request->getQueryParam('zrl', '')), + $pager->getItemsPerPage(), + $pager->getStart(), + $sql_where, + $values, + ); - $count = $this->profileModel->getCountForDisplay($condition, $values); + $count = $this->profileModel->getCountForDisplay($sql_where, $values); $vars = [ 'title' => $this->l10n->gettext('People'), @@ -82,7 +94,6 @@ class Directory extends BaseController $content = $this->renderer->fetch('directory.phtml', $vars); - // Render index view return ['content' => $content]; } } diff --git a/src/classes/Controllers/Web/Search.php b/src/classes/Controllers/Web/Search.php index d70925a..fc6f5ff 100644 --- a/src/classes/Controllers/Web/Search.php +++ b/src/classes/Controllers/Web/Search.php @@ -13,6 +13,10 @@ class Search extends BaseController * @var \Atlas\Pdo\Connection */ private $atlas; + /** + * @var \Friendica\Directory\Models\Server + */ + private $serverModel; /** * @var \Friendica\Directory\Models\Profile */ @@ -32,6 +36,7 @@ class Search extends BaseController public function __construct( \Atlas\Pdo\Connection $atlas, + \Friendica\Directory\Models\Server $serverModel, \Friendica\Directory\Models\Profile $profileModel, \Friendica\Directory\Views\Widget\AccountTypeTabs $accountTypeTabs, \Friendica\Directory\Views\PhpRenderer $renderer, @@ -39,6 +44,7 @@ class Search extends BaseController ) { $this->atlas = $atlas; + $this->serverModel = $serverModel; $this->profileModel = $profileModel; $this->accountTypeTabs = $accountTypeTabs; $this->renderer = $renderer; @@ -89,7 +95,13 @@ AND `account_type` = :account_type'; $values['account_type'] = $account_type; } - $profiles = $this->profileModel->getListForDisplay($pager->getItemsPerPage(), $pager->getStart(), $sql_where, $values); + $profiles = $this->profileModel->getListForDisplay( + $this->serverModel->getSubscribeUrlByProfile($request->getQueryParam('zrl', '')), + $pager->getItemsPerPage(), + $pager->getStart(), + $sql_where, + $values, + ); $count = $this->profileModel->getCountForDisplay($sql_where, $values); @@ -106,7 +118,6 @@ AND `account_type` = :account_type'; $content = $this->renderer->fetch('search.phtml', $vars); - // Render index view return ['content' => $content, 'noNavSearch' => true]; } } diff --git a/src/classes/Models/Profile.php b/src/classes/Models/Profile.php index e8e5324..5f31792 100644 --- a/src/classes/Models/Profile.php +++ b/src/classes/Models/Profile.php @@ -74,7 +74,7 @@ class Profile extends \Friendica\Directory\Model ]; } - public function getListForDisplay(int $limit = 30, int $start = 0, string $condition = '', array $values = []): array + public function getListForDisplay(string $subscribeUrl = null, int $limit = 30, int $start = 0, string $condition = '', array $values = []): array { if ($condition) { $condition = 'AND ' . $condition; @@ -87,7 +87,7 @@ class Profile extends \Friendica\Directory\Model $stmt = 'SELECT p.`id`, p.`name`, p.`username`, p.`addr`, p.`account_type`, p.`language`, p.`pdesc`, p.`locality`, p.`region`, p.`country`, p.`profile_url`, p.`dfrn_request`, - p.`photo`, p.`tags`, p.`last_activity` + p.`photo`, p.`tags`, p.`last_activity`, s.`version` FROM `profile` p JOIN `server` s ON s.`id` = p.`server_id` AND s.`available` AND NOT s.`hidden` WHERE p.`available` @@ -98,6 +98,12 @@ class Profile extends \Friendica\Directory\Model LIMIT :start, :limit'; $profiles = $this->atlas->fetchAll($stmt, $values); + array_walk($profiles, function (array &$profile) use ($subscribeUrl) { + $profile['remote_follow'] = version_compare($profile['version'], '2020.03', '>=') ? str_replace('/profile/', '/remote_follow/', $profile['profile_url']) : null; + $profile['subscribe'] = $subscribeUrl ? str_replace('{uri}', urlencode($profile['profile_url']), $subscribeUrl): null; + unset($profile['version']); + }); + return $profiles; } diff --git a/src/classes/Models/Server.php b/src/classes/Models/Server.php index 9f1ec5c..3e89603 100644 --- a/src/classes/Models/Server.php +++ b/src/classes/Models/Server.php @@ -41,4 +41,20 @@ class Server extends \Friendica\Directory\Model 'alias' => strtolower($server_alias) ]); } + + /** + * Returns the complete subscribe URL of the given profile URL if we have it for the related server + * + * @param string $profile_url + * @return mixed|null + */ + public function getSubscribeUrlByProfile(string $profile_url) + { + if (preg_match('#^(.+)/profile/#', $profile_url, $matches)) { + $server = $this->getByUrlAlias($matches[1]); + return $server['subscribe_url'] ?? null; + } + + return null; + } } diff --git a/src/classes/Routes/Http/MatchSearch.php b/src/classes/Routes/Http/MatchSearch.php index 7590b71..1c70ba6 100644 --- a/src/classes/Routes/Http/MatchSearch.php +++ b/src/classes/Routes/Http/MatchSearch.php @@ -10,7 +10,6 @@ class MatchSearch extends BaseRoute public function __invoke(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args): \Slim\Http\Response { return (new \Friendica\Directory\Controllers\Api\MatchSearch( - $this->container->atlas, $this->container->get(\Friendica\Directory\Models\Profile::class), $this->container->l10n ))->render($request, $response, $args); diff --git a/src/classes/Routes/Http/Search.php b/src/classes/Routes/Http/Search.php index b9db49d..ba4a533 100644 --- a/src/classes/Routes/Http/Search.php +++ b/src/classes/Routes/Http/Search.php @@ -10,7 +10,6 @@ class Search extends BaseRoute public function __invoke(\Slim\Http\Request $request, \Slim\Http\Response $response, array $args): \Slim\Http\Response { return (new \Friendica\Directory\Controllers\Api\Search( - $this->container->atlas, $this->container->get(\Friendica\Directory\Models\Profile::class), $this->container->l10n ))->render($request, $response, $args); diff --git a/src/classes/Routes/Web/Directory.php b/src/classes/Routes/Web/Directory.php index 5d70edc..f5228b2 100644 --- a/src/classes/Routes/Web/Directory.php +++ b/src/classes/Routes/Web/Directory.php @@ -13,6 +13,7 @@ class Directory extends BaseRoute $this->controller = new \Friendica\Directory\Controllers\Web\Directory( $this->container->atlas, + $this->container->get(\Friendica\Directory\Models\Server::class), $this->container->get(\Friendica\Directory\Models\Profile::class), $this->container->get(\Friendica\Directory\Views\Widget\AccountTypeTabs::class), $this->container->renderer, diff --git a/src/classes/Routes/Web/Search.php b/src/classes/Routes/Web/Search.php index d758053..324c5ba 100644 --- a/src/classes/Routes/Web/Search.php +++ b/src/classes/Routes/Web/Search.php @@ -13,6 +13,7 @@ class Search extends BaseRoute $this->controller = new \Friendica\Directory\Controllers\Web\Search( $this->container->atlas, + $this->container->get(\Friendica\Directory\Models\Server::class), $this->container->get(\Friendica\Directory\Models\Profile::class), $this->container->get(\Friendica\Directory\Views\Widget\AccountTypeTabs::class), $this->container->renderer, diff --git a/src/templates/sub/profile.phtml b/src/templates/sub/profile.phtml index 08afd46..68c67c0 100644 --- a/src/templates/sub/profile.phtml +++ b/src/templates/sub/profile.phtml @@ -26,13 +26,16 @@ if (!empty($profile['country'])) {
- - + + p__('verb', 'Follow')?> - - - + + + p__('verb', 'Follow')?> + + + p__('verb', 'Follow')?>