From 1938ec3ebecd71c806d1cddf2400786a649a8c40 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan <hypolite@mrpetovan.com>
Date: Sun, 23 Dec 2018 19:42:50 -0500
Subject: [PATCH] Rework mod/match

- Replace classic pager with a start index
- Remove q() calls
- Ensure template is still loaded even with no results.
- Improve Minimal Pager display of next link
---
 mod/match.php         | 166 ++++++++++++++++++++++--------------------
 src/Content/Pager.php |   2 +-
 2 files changed, 88 insertions(+), 80 deletions(-)

diff --git a/mod/match.php b/mod/match.php
index 0ec7534662..451821f9f1 100644
--- a/mod/match.php
+++ b/mod/match.php
@@ -12,11 +12,9 @@ use Friendica\Core\Renderer;
 use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\Model\Contact;
+use Friendica\Model\Profile;
 use Friendica\Util\Network;
 use Friendica\Util\Proxy as ProxyUtils;
-use Friendica\Util\Strings;
-
-require_once 'include/text.php';
 
 /**
  * @brief Controller for /match.
@@ -26,13 +24,12 @@ require_once 'include/text.php';
  *
  * @param App $a App
  *
- * @return void|string
+ * @return string
  */
 function match_content(App $a)
 {
-	$o = '';
-	if (! local_user()) {
-		return;
+	if (!local_user()) {
+		return '';
 	}
 
 	$a->page['aside'] .= Widget::findPeople();
@@ -40,91 +37,102 @@ function match_content(App $a)
 
 	$_SESSION['return_path'] = $a->cmd;
 
-	$r = q(
-		"SELECT `pub_keywords`, `prv_keywords` FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1",
-		intval(local_user())
-	);
-	if (! DBA::isResult($r)) {
-		return;
+	$profile = Profile::getByUID(local_user());
+
+	if (!DBA::isResult($profile)) {
+		return '';
 	}
-	if (! $r[0]['pub_keywords'] && (! $r[0]['prv_keywords'])) {
+	if (!$profile['pub_keywords'] && (!$profile['prv_keywords'])) {
 		notice(L10n::t('No keywords to match. Please add keywords to your default profile.') . EOL);
-		return;
+		return '';
 	}
 
 	$params = [];
-	$tags = trim($r[0]['pub_keywords'] . ' ' . $r[0]['prv_keywords']);
+	$tags = trim($profile['pub_keywords'] . ' ' . $profile['prv_keywords']);
 
-	if ($tags) {
-		$pager = new Pager($a->query_string);
+	$params['s'] = $tags;
+	$params['n'] = 100;
 
-		$params['s'] = $tags;
-		if ($pager->getPage() != 1) {
-			$params['p'] = $pager->getPage();
-		}
+	if (strlen(Config::get('system', 'directory'))) {
+		$host = get_server();
+	} else {
+		$host = System::baseUrl();
+	}
 
-		if (strlen(Config::get('system', 'directory'))) {
-			$x = Network::post(get_server().'/msearch', $params)->getBody();
-		} else {
-			$x = Network::post(System::baseUrl() . '/msearch', $params)->getBody();
-		}
+	$msearch_json = Network::post($host . '/msearch', $params)->getBody();
 
-		$j = json_decode($x);
-
-		if (count($j->results)) {
-			$pager->setItemsPerPage($j->items_page);
-
-			$id = 0;
-
-			foreach ($j->results as $jj) {
-				$match_nurl = Strings::normaliseLink($jj->url);
-				$match = q(
-					"SELECT `nurl` FROM `contact` WHERE `uid` = '%d' AND nurl='%s' LIMIT 1",
-					intval(local_user()),
-					DBA::escape($match_nurl)
-				);
-
-				if (!count($match)) {
-					$jj->photo = str_replace("http:///photo/", get_server()."/photo/", $jj->photo);
-					$connlnk = System::baseUrl() . '/follow/?url=' . $jj->url;
-					$photo_menu = [
-						'profile' => [L10n::t("View Profile"), Contact::magicLink($jj->url)],
-						'follow' => [L10n::t("Connect/Follow"), $connlnk]
-					];
-
-					$contact_details = Contact::getDetailsByURL($jj->url, local_user());
-
-					$entry = [
-						'url' => Contact::magicLink($jj->url),
-						'itemurl' => defaults($contact_details, 'addr', $jj->url),
-						'name' => $jj->name,
-						'details'       => defaults($contact_details, 'location', ''),
-						'tags'          => defaults($contact_details, 'keywords', ''),
-						'about'         => defaults($contact_details, 'about', ''),
-						'account_type'  => Contact::getAccountType($contact_details),
-						'thumb' => ProxyUtils::proxifyUrl($jj->photo, false, ProxyUtils::SIZE_THUMB),
-						'inttxt' => ' ' . L10n::t('is interested in:'),
-						'conntxt' => L10n::t('Connect'),
-						'connlnk' => $connlnk,
-						'img_hover' => $jj->tags,
-						'photo_menu' => $photo_menu,
-						'id' => ++$id,
-					];
-					$entries[] = $entry;
-				}
-			}
+	$msearch = json_decode($msearch_json);
+
+	$start = defaults($_GET, 'start', 0);
+	$entries = [];
+	$paginate = '';
 
-			$tpl = Renderer::getMarkupTemplate('viewcontact_template.tpl');
+	if (!empty($msearch->results)) {
+		for ($i = $start;count($entries) < 10 && $i < $msearch->total; $i++) {
+			$profile = $msearch->results[$i];
 
-			$o .= Renderer::replaceMacros($tpl, [
-				'$title'    => L10n::t('Profile Match'),
-				'$contacts' => $entries,
-				'$paginate' => $pager->renderFull($j->total)
-			]);
-		} else {
-			info(L10n::t('No matches') . EOL);
+			// Already known contact
+			if (Contact::getIdForURL($profile->url, local_user(), true)) {
+				continue;
+			}
+
+			// Workaround for wrong directory photo URL
+			$profile->photo = str_replace('http:///photo/', get_server() . '/photo/', $profile->photo);
+
+			$connlnk = System::baseUrl() . '/follow/?url=' . $profile->url;
+			$photo_menu = [
+				'profile' => [L10n::t("View Profile"), Contact::magicLink($profile->url)],
+				'follow' => [L10n::t("Connect/Follow"), $connlnk]
+			];
+
+			$contact_details = Contact::getDetailsByURL($profile->url, 0);
+
+			$entry = [
+				'url'          => Contact::magicLink($profile->url),
+				'itemurl'      => defaults($contact_details, 'addr', $profile->url),
+				'name'         => $profile->name,
+				'details'      => defaults($contact_details, 'location', ''),
+				'tags'         => defaults($contact_details, 'keywords', ''),
+				'about'        => defaults($contact_details, 'about', ''),
+				'account_type' => Contact::getAccountType($contact_details),
+				'thumb'        => ProxyUtils::proxifyUrl($profile->photo, false, ProxyUtils::SIZE_THUMB),
+				'conntxt'      => L10n::t('Connect'),
+				'connlnk'      => $connlnk,
+				'img_hover'    => $profile->tags,
+				'photo_menu'   => $photo_menu,
+				'id'           => $i,
+			];
+			$entries[] = $entry;
 		}
+
+		$data = [
+			'class' => 'pager',
+			'first' => [
+				'url'   => 'match',
+				'text'  => L10n::t('first'),
+				'class' => 'previous' . ($start == 0 ? 'disabled' : '')
+			],
+			'next'  => [
+				'url'   => 'match?start=' . $i,
+				'text'  => L10n::t('next'),
+				'class' =>  'next' . ($i >= $msearch->total ? ' disabled' : '')
+			]
+		];
+
+		$tpl = Renderer::getMarkupTemplate('paginate.tpl');
+		$paginate = Renderer::replaceMacros($tpl, ['pager' => $data]);
 	}
 
+	if (empty($entries)) {
+		info(L10n::t('No matches') . EOL);
+	}
+
+	$tpl = Renderer::getMarkupTemplate('viewcontact_template.tpl');
+	$o = Renderer::replaceMacros($tpl, [
+		'$title'    => L10n::t('Profile Match'),
+		'$contacts' => $entries,
+		'$paginate' => $paginate
+	]);
+
 	return $o;
 }
diff --git a/src/Content/Pager.php b/src/Content/Pager.php
index 098d8e8796..0a1766fe59 100644
--- a/src/Content/Pager.php
+++ b/src/Content/Pager.php
@@ -169,7 +169,7 @@ class Pager
 			'next'  => [
 				'url'   => $this->ensureQueryParameter($this->baseQueryString . '&page=' . ($this->getPage() + 1)),
 				'text'  => L10n::t('older'),
-				'class' =>  'next' . ($displayedItemCount <= 0 ? ' disabled' : '')
+				'class' =>  'next' . ($displayedItemCount < $this->getItemsPerPage() ? ' disabled' : '')
 			]
 		];
 
-- 
2.39.5