From cdf8a2f37475400ba56c9f82f853e93dba39a4c3 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 3 Aug 2020 16:03:51 +0000 Subject: [PATCH 1/4] Fix Notice: " Undefined index: urls in /src/Worker/UpdateServerDirectory.php on line 64" --- src/Worker/UpdateServerDirectory.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Worker/UpdateServerDirectory.php b/src/Worker/UpdateServerDirectory.php index dd94aa52c7..90bd5c50a4 100644 --- a/src/Worker/UpdateServerDirectory.php +++ b/src/Worker/UpdateServerDirectory.php @@ -61,6 +61,9 @@ class UpdateServerDirectory $urls = []; foreach ($contacts['entry'] as $entry) { + if (empty($entry['urls'])) { + continue; + } foreach ($entry['urls'] as $url_entry) { if (empty($url_entry['type']) || empty($url_entry['value'])) { continue; From 22db644295ada6e2f8e3203cae0e8bebb3ed0377 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Mon, 3 Aug 2020 18:58:12 +0200 Subject: [PATCH 2/4] Update src/Worker/UpdateServerDirectory.php Co-authored-by: Hypolite Petovan --- src/Worker/UpdateServerDirectory.php | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Worker/UpdateServerDirectory.php b/src/Worker/UpdateServerDirectory.php index 90bd5c50a4..1244e2c2c0 100644 --- a/src/Worker/UpdateServerDirectory.php +++ b/src/Worker/UpdateServerDirectory.php @@ -60,11 +60,8 @@ class UpdateServerDirectory Logger::info('PoCo discovery started', ['poco' => $gserver['poco']]); $urls = []; - foreach ($contacts['entry'] as $entry) { - if (empty($entry['urls'])) { - continue; - } - foreach ($entry['urls'] as $url_entry) { + foreach (array_column($contacts['entry'], 'urls') as $urls) { + foreach ($urls as $url_entry) { if (empty($url_entry['type']) || empty($url_entry['value'])) { continue; } From 24a82110fd45a8422efee0677b7acc214aa66e9a Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Wed, 29 Jul 2020 11:30:54 -0400 Subject: [PATCH 3/4] Add common relationship methods to Model\ContactRelation - Introduce DBA::mergeConditions method - Replace GContact relationship method contents with Model\ContactRelation method calls --- src/BaseRepository.php | 10 +- src/Database/DBA.php | 30 +- src/Model/ContactRelation.php | 335 +++++++++++++++++++++ src/Model/GContact.php | 157 ++++------ src/Module/Api/Twitter/ContactEndpoint.php | 10 +- 5 files changed, 425 insertions(+), 117 deletions(-) diff --git a/src/BaseRepository.php b/src/BaseRepository.php index 64a0d1c510..abec4c119b 100644 --- a/src/BaseRepository.php +++ b/src/BaseRepository.php @@ -109,26 +109,22 @@ abstract class BaseRepository extends BaseFactory */ public function selectByBoundaries(array $condition = [], array $params = [], int $max_id = null, int $since_id = null, int $limit = self::LIMIT) { - $condition = DBA::collapseCondition($condition); + $totalCount = DBA::count(static::$table_name, $condition); $boundCondition = $condition; if (isset($max_id)) { - $boundCondition[0] .= " AND `id` < ?"; - $boundCondition[] = $max_id; + $boundCondition = DBA::mergeConditions($boundCondition, ['`id` < ?', $max_id]); } if (isset($since_id)) { - $boundCondition[0] .= " AND `id` > ?"; - $boundCondition[] = $since_id; + $boundCondition = DBA::mergeConditions($boundCondition, ['`id` > ?', $since_id]); } $params['limit'] = $limit; $models = $this->selectModels($boundCondition, $params); - $totalCount = DBA::count(static::$table_name, $condition); - return new static::$collection_class($models, $totalCount); } diff --git a/src/Database/DBA.php b/src/Database/DBA.php index f3edf52be5..46bd871b4a 100644 --- a/src/Database/DBA.php +++ b/src/Database/DBA.php @@ -539,7 +539,7 @@ class DBA * Returns the SQL condition string built from the provided condition array * * This function operates with two modes. - * - Supplied with a filed/value associative array, it builds simple strict + * - Supplied with a field/value associative array, it builds simple strict * equality conditions linked by AND. * - Supplied with a flat list, the first element is the condition string and * the following arguments are the values to be interpolated @@ -645,6 +645,34 @@ class DBA return $condition; } + /** + * Merges the provided conditions into a single collapsed one + * + * @param array ...$conditions One or more condition arrays + * @return array A collapsed condition + * @see DBA::collapseCondition() for the condition array formats + */ + public static function mergeConditions(array ...$conditions) + { + $conditionStrings = []; + $result = []; + + foreach ($conditions as $key => $condition) { + $condition = self::collapseCondition($condition); + + $conditionStrings[] = array_shift($condition); + // The result array holds the eventual parameter values + $result = array_merge($result, $condition); + } + + if (count($conditionStrings)) { + // We prepend the condition string at the end to form a collapsed condition array again + array_unshift($result, implode(' AND ', $conditionStrings)); + } + + return $result; + } + /** * Returns the SQL parameter string built from the provided parameter array * diff --git a/src/Model/ContactRelation.php b/src/Model/ContactRelation.php index e8b0f81f03..85dbc93b9b 100644 --- a/src/Model/ContactRelation.php +++ b/src/Model/ContactRelation.php @@ -21,6 +21,7 @@ namespace Friendica\Model; +use Exception; use Friendica\Core\Logger; use Friendica\Core\Protocol; use Friendica\Database\DBA; @@ -29,6 +30,11 @@ use Friendica\Protocol\ActivityPub; use Friendica\Util\DateTimeFormat; use Friendica\Util\Strings; +/** + * This class provides relationship information based on the `contact-relation` table. + * This table is directional (cid = source, relation-cid = target), references public contacts (with uid=0) and records both + * follows and the last interaction (likes/comments) on public posts. + */ class ContactRelation { /** @@ -200,4 +206,333 @@ class ContactRelation return true; } + + /** + * Counts all the known follows of the provided public contact + * + * @param int $cid Public contact id + * @param array $condition Additional condition on the contact table + * @return int + * @throws Exception + */ + public static function countFollows(int $cid, array $condition = []) + { + $condition = DBA::mergeConditions($condition, + ['`id` IN ( + SELECT `relation-cid` + FROM `contact-relation` + WHERE `cid` = ? + AND `follows` +)', $cid] + ); + + return DI::dba()->count('contact', $condition); + } + + /** + * Returns a paginated list of contacts that are followed the provided public contact. + * + * @param int $cid Public contact id + * @param array $condition Additional condition on the contact table + * @param int $count + * @param int $offset + * @param bool $shuffle + * @return array + * @throws Exception + */ + public static function listFollows(int $cid, array $condition = [], int $count = 30, int $offset = 0, bool $shuffle = false) + { + $condition = DBA::mergeConditions($condition, + ['`id` IN ( + SELECT `relation-cid` + FROM `contact-relation` + WHERE `cid` = ? + AND `follows` +)', $cid] + ); + + $follows = DI::dba()->selectToArray( + 'contact', + $condition, + [ + 'limit' => [$offset, $count], + 'order' => [$shuffle ? 'RAND()' : 'name'] + ] + ); + + return $follows; + } + + /** + * Counts all the known followers of the provided public contact + * + * @param int $cid Public contact id + * @param array $condition Additional condition on the contact table + * @return int + * @throws Exception + */ + public static function countFollowers(int $cid, array $condition = []) + { + $condition = DBA::mergeConditions($condition, + ['`id` IN ( + SELECT `cid` + FROM `contact-relation` + WHERE `relation-cid` = ? + AND `follows` +)', $cid] + ); + + return DI::dba()->count('contact', $condition); + } + + /** + * Returns a paginated list of contacts that follow the provided public contact. + * + * @param int $cid Public contact id + * @param array $condition Additional condition on the contact table + * @param int $count + * @param int $offset + * @param bool $shuffle + * @return array + * @throws Exception + */ + public static function listFollowers(int $cid, array $condition = [], int $count = 30, int $offset = 0, bool $shuffle = false) + { + $condition = DBA::mergeConditions($condition, + ['`id` IN ( + SELECT `cid` + FROM `contact-relation` + WHERE `relation-cid` = ? + AND `follows` +)', $cid] + ); + + $followers = DI::dba()->selectToArray( + 'contact', + $condition, + [ + 'limit' => [$offset, $count], + 'order' => [$shuffle ? 'RAND()' : 'name'] + ] + ); + + return $followers; + } + + /** + * Counts the number of contacts that both provided public contacts have interacted with at least once. + * Interactions include follows and likes and comments on public posts. + * + * @param int $sourceId Public contact id + * @param int $targetId Public contact id + * @param array $condition Additional condition array on the contact table + * @return int + * @throws Exception + */ + public static function countCommon(int $sourceId, int $targetId, array $condition = []) + { + $condition = DBA::mergeConditions($condition, + ['`id` IN ( + SELECT `relation-cid` + FROM `contact-relation` + WHERE `cid` = ? +) + AND `id` IN ( + SELECT `relation-cid` + FROM `contact-relation` + WHERE `cid` = ? +)', $sourceId, $targetId] + ); + + $total = DI::dba()->count('contact', $condition); + + return $total; + } + + /** + * Returns a paginated list of contacts that both provided public contacts have interacted with at least once. + * Interactions include follows and likes and comments on public posts. + * + * @param int $sourceId Public contact id + * @param int $targetId Public contact id + * @param array $condition Additional condition on the contact table + * @param int $count + * @param int $offset + * @param bool $shuffle + * @return array + * @throws Exception + */ + public static function listCommon(int $sourceId, int $targetId, array $condition = [], int $count = 30, int $offset = 0, bool $shuffle = false) + { + $condition = DBA::mergeConditions($condition, + ["`id` IN ( + SELECT `relation-cid` + FROM `contact-relation` + WHERE `cid` = ? + AND `follows` +) + AND `id` IN ( + SELECT `relation-cid` + FROM `contact-relation` + WHERE `cid` = ? + AND `follows` +)", $sourceId, $targetId] + ); + + $contacts = DI::dba()->selectToArray( + 'contact', + $condition, + [ + 'limit' => [$offset, $count], + 'order' => [$shuffle ? 'name' : 'RAND()'], + ] + ); + + return $contacts; + } + + + /** + * Counts the number of contacts that are followed by both provided public contacts. + * + * @param int $sourceId Public contact id + * @param int $targetId Public contact id + * @param array $condition Additional condition array on the contact table + * @return int + * @throws Exception + */ + public static function countCommonFollows(int $sourceId, int $targetId, array $condition = []) + { + $condition = DBA::mergeConditions($condition, + ['`id` IN ( + SELECT `relation-cid` + FROM `contact-relation` + WHERE `cid` = ? + AND `follows` +) + AND `id` IN ( + SELECT `relation-cid` + FROM `contact-relation` + WHERE `cid` = ? + AND `follows` +)', $sourceId, $targetId] + ); + + $total = DI::dba()->count('contact', $condition); + + return $total; + } + + /** + * Returns a paginated list of contacts that are followed by both provided public contacts. + * + * @param int $sourceId Public contact id + * @param int $targetId Public contact id + * @param array $condition Additional condition array on the contact table + * @param int $count + * @param int $offset + * @param bool $shuffle + * @return array + * @throws Exception + */ + public static function listCommonFollows(int $sourceId, int $targetId, array $condition = [], int $count = 30, int $offset = 0, bool $shuffle = false) + { + $condition = DBA::mergeConditions($condition, + ["`id` IN ( + SELECT `relation-cid` + FROM `contact-relation` + WHERE `cid` = ? + AND `follows` +) + AND `id` IN ( + SELECT `relation-cid` + FROM `contact-relation` + WHERE `cid` = ? + AND `follows` +)", $sourceId, $targetId] + ); + + $contacts = DI::dba()->selectToArray( + 'contact', + $condition, + [ + 'limit' => [$offset, $count], + 'order' => [$shuffle ? 'name' : 'RAND()'], + ] + ); + + return $contacts; + } + + /** + * Counts the number of contacts that follow both provided public contacts. + * + * @param int $sourceId Public contact id + * @param int $targetId Public contact id + * @param array $condition Additional condition on the contact table + * @return int + * @throws Exception + */ + public static function countCommonFollowers(int $sourceId, int $targetId, array $condition = []) + { + $condition = DBA::mergeConditions($condition, + ['`id` IN ( + SELECT `cid` + FROM `contact-relation` + WHERE `relation-cid` = ? + AND `follows` +) + AND `id` IN ( + SELECT `cid` + FROM `contact-relation` + WHERE `relation-cid` = ? + AND `follows` +)', $sourceId, $targetId] + ); + + $total = DI::dba()->count('contact', $condition); + + return $total; + } + + /** + * Returns a paginated list of contacts that follow both provided public contacts. + * + * @param int $sourceId Public contact id + * @param int $targetId Public contact id + * @param array $condition Additional condition on the contact table + * @param int $count + * @param int $offset + * @param bool $shuffle + * @return array + * @throws Exception + */ + public static function listCommonFollowers(int $sourceId, int $targetId, array $condition = [], int $count = 30, int $offset = 0, bool $shuffle = false) + { + $condition = DBA::mergeConditions($condition, + ["`id` IN ( + SELECT `cid` + FROM `contact-relation` + WHERE `relation-cid` = ? + AND `follows` +) + AND `id` IN ( + SELECT `cid` + FROM `contact-relation` + WHERE `relation-cid` = ? + AND `follows` +)", $sourceId, $targetId] + ); + + $contacts = DI::dba()->selectToArray( + 'contact', + $condition, + [ + 'limit' => [$offset, $count], + 'order' => [$shuffle ? 'name' : 'RAND()'], + ] + ); + + return $contacts; + } } diff --git a/src/Model/GContact.php b/src/Model/GContact.php index ce224f44c0..55749d3b19 100644 --- a/src/Model/GContact.php +++ b/src/Model/GContact.php @@ -39,22 +39,16 @@ class GContact */ public static function countCommonFriends($uid, $cid) { - $r = q( - "SELECT count(*) as `total` - FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id` - WHERE `glink`.`cid` = %d AND `glink`.`uid` = %d AND - NOT `gcontact`.`failed` - AND `gcontact`.`nurl` IN (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 and id != %d) ", - intval($cid), - intval($uid), - intval($uid), - intval($cid) - ); + $sourceId = Contact::getPublicIdByUserId($uid); - if (DBA::isResult($r)) { - return $r[0]['total']; - } - return 0; + $targetIds = Contact::getPublicAndUserContacID($cid, $uid); + + $condition = [ + 'NOT `self` AND NOT `blocked` AND NOT `hidden` AND `id` != ?', + $sourceId, + ]; + + return ContactRelation::countCommonFollows($sourceId, $targetIds['public'] ?? 0, $condition); } /** @@ -65,92 +59,74 @@ class GContact */ public static function countCommonFriendsZcid($uid, $zcid) { - $r = q( - "SELECT count(*) as `total` - FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id` - where `glink`.`zcid` = %d - and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0) ", - intval($zcid), - intval($uid) + $sourceId = Contact::getPublicIdByUserId($uid); + + $targetPublicContact = DI::dba()->fetchFirst(" +SELECT `id` +FROM `contact` c +JOIN `gcontact` z ON z.`nurl` = c.`nurl` +AND z.`id` = ? +AND c.`uid` = 0 +LIMIT 1", + $zcid ); - if (DBA::isResult($r)) { - return $r[0]['total']; - } - - return 0; + return ContactRelation::countCommonFollowers($sourceId, $targetPublicContact['id'] ?? 0); } /** - * @param integer $uid user - * @param integer $cid cid + * Returns the cross-section between the local user contacts and one of their contact's own relationships + * as known by the local node. + * + * @param integer $uid local user id + * @param integer $cid user contact id to compare friends with * @param integer $start optional, default 0 * @param integer $limit optional, default 9999 * @param boolean $shuffle optional, default false - * @return object + * @return array * @throws Exception */ public static function commonFriends($uid, $cid, $start = 0, $limit = 9999, $shuffle = false) { - if ($shuffle) { - $sql_extra = " order by rand() "; - } else { - $sql_extra = " order by `gcontact`.`name` asc "; - } + $sourceId = Contact::getPublicIdByUserId($uid); - $r = q( - "SELECT `gcontact`.*, `contact`.`id` AS `cid` - FROM `glink` - INNER JOIN `gcontact` ON `glink`.`gcid` = `gcontact`.`id` - INNER JOIN `contact` ON `gcontact`.`nurl` = `contact`.`nurl` - WHERE `glink`.`cid` = %d and `glink`.`uid` = %d - AND `contact`.`uid` = %d AND `contact`.`self` = 0 AND `contact`.`blocked` = 0 - AND `contact`.`hidden` = 0 AND `contact`.`id` != %d - AND NOT `gcontact`.`failed` - $sql_extra LIMIT %d, %d", - intval($cid), - intval($uid), - intval($uid), - intval($cid), - intval($start), - intval($limit) - ); + $targetIds = Contact::getPublicAndUserContacID($cid, $uid); - /// @TODO Check all calling-findings of this function if they properly use DBA::isResult() - return $r; + $condition = [ + 'NOT `self` AND NOT `blocked` AND NOT `hidden` AND `id` != ?', + $sourceId, + ]; + + return ContactRelation::listCommonFollows($sourceId, $targetIds['public'] ?? 0, $condition, $limit, $start, $shuffle); } /** - * @param integer $uid user - * @param integer $zcid zcid + * Returns the cross-section between a local user and a remote visitor contact's own relationships + * as known by the local node. + * + * @param integer $uid local user id + * @param integer $zcid remote visitor contact zcid * @param integer $start optional, default 0 * @param integer $limit optional, default 9999 * @param boolean $shuffle optional, default false - * @return object + * @return array * @throws Exception */ public static function commonFriendsZcid($uid, $zcid, $start = 0, $limit = 9999, $shuffle = false) { - if ($shuffle) { - $sql_extra = " order by rand() "; - } else { - $sql_extra = " order by `gcontact`.`name` asc "; - } + $sourceId = Contact::getPublicIdByUserId($uid); - $r = q( - "SELECT `gcontact`.* - FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id` - where `glink`.`zcid` = %d - and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0) - $sql_extra limit %d, %d", - intval($zcid), - intval($uid), - intval($start), - intval($limit) + $targetPublicContact = DI::dba()->fetchFirst(" +SELECT c.`id` +FROM `contact` c +JOIN `gcontact` z ON z.`nurl` = c.`nurl` +AND z.`id` = ? +AND c.`uid` = 0 +LIMIT 1", + $zcid ); - /// @TODO Check all calling-findings of this function if they properly use DBA::isResult() - return $r; + return ContactRelation::listCommonFollows($sourceId, $targetPublicContact['id'] ?? 0, [], $limit, $start, $shuffle); } /** @@ -161,20 +137,9 @@ class GContact */ public static function countAllFriends($uid, $cid) { - $r = q( - "SELECT count(*) as `total` - FROM `glink` INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id` - where `glink`.`cid` = %d and `glink`.`uid` = %d AND - NOT `gcontact`.`failed`", - intval($cid), - intval($uid) - ); + $cids = Contact::getPublicAndUserContacID($cid, $uid); - if (DBA::isResult($r)) { - return $r[0]['total']; - } - - return 0; + return ContactRelation::countFollows($cids['public'] ?? 0); } /** @@ -187,22 +152,8 @@ class GContact */ public static function allFriends($uid, $cid, $start = 0, $limit = 80) { - $r = q( - "SELECT `gcontact`.*, `contact`.`id` AS `cid` - FROM `glink` - INNER JOIN `gcontact` on `glink`.`gcid` = `gcontact`.`id` - LEFT JOIN `contact` ON `contact`.`nurl` = `gcontact`.`nurl` AND `contact`.`uid` = %d - WHERE `glink`.`cid` = %d AND `glink`.`uid` = %d AND - NOT `gcontact`.`failed` - ORDER BY `gcontact`.`name` ASC LIMIT %d, %d ", - intval($uid), - intval($cid), - intval($uid), - intval($start), - intval($limit) - ); + $cids = Contact::getPublicAndUserContacID($cid, $uid); - /// @TODO Check all calling-findings of this function if they properly use DBA::isResult() - return $r; + return ContactRelation::listFollows($cids['public'] ?? 0, [], $limit, $start); } } diff --git a/src/Module/Api/Twitter/ContactEndpoint.php b/src/Module/Api/Twitter/ContactEndpoint.php index 116f8eea2d..f341019716 100644 --- a/src/Module/Api/Twitter/ContactEndpoint.php +++ b/src/Module/Api/Twitter/ContactEndpoint.php @@ -143,7 +143,7 @@ abstract class ContactEndpoint extends BaseApi $previous_cursor = 0; $total_count = 0; if (!$hide_friends) { - $condition = DBA::collapseCondition([ + $condition = [ 'rel' => $rel, 'uid' => $uid, 'self' => false, @@ -151,17 +151,15 @@ abstract class ContactEndpoint extends BaseApi 'hidden' => false, 'archive' => false, 'pending' => false - ]); + ]; $total_count = DBA::count('contact', $condition); if ($cursor !== -1) { if ($cursor > 0) { - $condition[0] .= " AND `id` > ?"; - $condition[] = $cursor; + $condition = DBA::mergeConditions($condition, ['`id` > ?', $cursor]); } else { - $condition[0] .= " AND `id` < ?"; - $condition[] = -$cursor; + $condition = DBA::mergeConditions($condition, ['`id` < ?', -$cursor]); } } From a74c547af470947c3420157cba237c4951da58f4 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 3 Aug 2020 13:10:49 -0400 Subject: [PATCH 4/4] Move ContactRelation class to Contact\Relation - Update references in GContact --- src/Model/Contact.php | 2 +- .../Relation.php} | 4 ++-- src/Model/GContact.php | 23 ++++++++++++++----- src/Model/Item.php | 2 +- src/Module/Admin/Site.php | 10 ++++---- src/Worker/ContactDiscovery.php | 4 ++-- 6 files changed, 28 insertions(+), 17 deletions(-) rename src/Model/{ContactRelation.php => Contact/Relation.php} (99%) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index b6b0fec5d9..3bd826945f 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -2124,7 +2124,7 @@ class Contact return false; } - if (ContactRelation::isDiscoverable($ret['url'])) { + if (Contact\Relation::isDiscoverable($ret['url'])) { Worker::add(PRIORITY_LOW, 'ContactDiscovery', $ret['url']); } diff --git a/src/Model/ContactRelation.php b/src/Model/Contact/Relation.php similarity index 99% rename from src/Model/ContactRelation.php rename to src/Model/Contact/Relation.php index 85dbc93b9b..a98f2bfd9a 100644 --- a/src/Model/ContactRelation.php +++ b/src/Model/Contact/Relation.php @@ -19,7 +19,7 @@ * */ -namespace Friendica\Model; +namespace Friendica\Model\Contact; use Exception; use Friendica\Core\Logger; @@ -35,7 +35,7 @@ use Friendica\Util\Strings; * This table is directional (cid = source, relation-cid = target), references public contacts (with uid=0) and records both * follows and the last interaction (likes/comments) on public posts. */ -class ContactRelation +class Relation { /** * No discovery of followers/followings diff --git a/src/Model/GContact.php b/src/Model/GContact.php index 55749d3b19..3051202689 100644 --- a/src/Model/GContact.php +++ b/src/Model/GContact.php @@ -24,6 +24,7 @@ namespace Friendica\Model; use Exception; use Friendica\Core\Protocol; use Friendica\Database\DBA; +use Friendica\DI; use Friendica\Util\DateTimeFormat; /** @@ -48,7 +49,7 @@ class GContact $sourceId, ]; - return ContactRelation::countCommonFollows($sourceId, $targetIds['public'] ?? 0, $condition); + return Contact\Relation::countCommonFollows($sourceId, $targetIds['public'] ?? 0, $condition); } /** @@ -71,7 +72,12 @@ LIMIT 1", $zcid ); - return ContactRelation::countCommonFollowers($sourceId, $targetPublicContact['id'] ?? 0); + $condition = [ + 'NOT `self` AND NOT `blocked` AND NOT `hidden` AND `id` != ?', + $sourceId, + ]; + + return Contact\Relation::countCommonFollowers($sourceId, $targetPublicContact['id'] ?? 0, $condition); } /** @@ -97,7 +103,7 @@ LIMIT 1", $sourceId, ]; - return ContactRelation::listCommonFollows($sourceId, $targetIds['public'] ?? 0, $condition, $limit, $start, $shuffle); + return Contact\Relation::listCommonFollows($sourceId, $targetIds['public'] ?? 0, $condition, $limit, $start, $shuffle); } /** @@ -126,7 +132,12 @@ LIMIT 1", $zcid ); - return ContactRelation::listCommonFollows($sourceId, $targetPublicContact['id'] ?? 0, [], $limit, $start, $shuffle); + $condition = [ + 'NOT `self` AND NOT `blocked` AND NOT `hidden` AND `id` != ?', + $sourceId, + ]; + + return Contact\Relation::listCommonFollows($sourceId, $targetPublicContact['id'] ?? 0, $condition, $limit, $start, $shuffle); } /** @@ -139,7 +150,7 @@ LIMIT 1", { $cids = Contact::getPublicAndUserContacID($cid, $uid); - return ContactRelation::countFollows($cids['public'] ?? 0); + return Contact\Relation::countFollows($cids['public'] ?? 0); } /** @@ -154,6 +165,6 @@ LIMIT 1", { $cids = Contact::getPublicAndUserContacID($cid, $uid); - return ContactRelation::listFollows($cids['public'] ?? 0, [], $limit, $start); + return Contact\Relation::listFollows($cids['public'] ?? 0, [], $limit, $start); } } diff --git a/src/Model/Item.php b/src/Model/Item.php index b6f8ffa3d1..54cd4a5db6 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -1554,7 +1554,7 @@ class Item } // Update the contact relations - ContactRelation::store($parent['author-id'], $item['author-id'], $item['created']); + Contact\Relation::store($parent['author-id'], $item['author-id'], $item['created']); } return $item; diff --git a/src/Module/Admin/Site.php b/src/Module/Admin/Site.php index 7b298cd937..50566b349f 100644 --- a/src/Module/Admin/Site.php +++ b/src/Module/Admin/Site.php @@ -28,7 +28,7 @@ use Friendica\Core\Theme; use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\DI; -use Friendica\Model\ContactRelation; +use Friendica\Model\Contact; use Friendica\Module\BaseAdmin; use Friendica\Module\Register; use Friendica\Util\BasePath; @@ -175,7 +175,7 @@ class Site extends BaseAdmin $min_memory = (!empty($_POST['min_memory']) ? intval(trim($_POST['min_memory'])) : 0); $optimize_max_tablesize = (!empty($_POST['optimize_max_tablesize']) ? intval(trim($_POST['optimize_max_tablesize'])) : 100); $optimize_fragmentation = (!empty($_POST['optimize_fragmentation']) ? intval(trim($_POST['optimize_fragmentation'])) : 30); - $contact_discovery = (!empty($_POST['contact_discovery']) ? intval(trim($_POST['contact_discovery'])) : ContactRelation::DISCOVERY_NONE); + $contact_discovery = (!empty($_POST['contact_discovery']) ? intval(trim($_POST['contact_discovery'])) : Contact\Relation::DISCOVERY_NONE); $synchronize_directory = (!empty($_POST['synchronize_directory']) ? intval(trim($_POST['synchronize_directory'])) : false); $poco_requery_days = (!empty($_POST['poco_requery_days']) ? intval(trim($_POST['poco_requery_days'])) : 7); $poco_discovery = (!empty($_POST['poco_discovery']) ? intval(trim($_POST['poco_discovery'])) : false); @@ -532,9 +532,9 @@ class Site extends BaseAdmin ]; $discovery_choices = [ - ContactRelation::DISCOVERY_NONE => DI::l10n()->t('none'), - ContactRelation::DISCOVERY_LOCAL => DI::l10n()->t('Local contacts'), - ContactRelation::DISCOVERY_INTERACTOR => DI::l10n()->t('Interactors'), + Contact\Relation::DISCOVERY_NONE => DI::l10n()->t('none'), + Contact\Relation::DISCOVERY_LOCAL => DI::l10n()->t('Local contacts'), + Contact\Relation::DISCOVERY_INTERACTOR => DI::l10n()->t('Interactors'), // "All" is deactivated until we are sure not to put too much stress on the fediverse with this // ContactRelation::DISCOVERY_ALL => DI::l10n()->t('All'), ]; diff --git a/src/Worker/ContactDiscovery.php b/src/Worker/ContactDiscovery.php index 34d4a7da0a..5dac173228 100644 --- a/src/Worker/ContactDiscovery.php +++ b/src/Worker/ContactDiscovery.php @@ -21,7 +21,7 @@ namespace Friendica\Worker; -use Friendica\Model\ContactRelation; +use Friendica\Model\Contact; class ContactDiscovery { @@ -31,6 +31,6 @@ class ContactDiscovery */ public static function execute(string $url) { - ContactRelation::discoverByUrl($url); + Contact\Relation::discoverByUrl($url); } }