X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModule%2FSearch%2FAcl.php;h=9f072b91c938df938c70ceb6047b1cda5fcea908;hb=99284222c1d7fb4adca9077e3057faf3b36f7180;hp=2c0cc967c03f20cc0aad820712e6bf74d7483a8c;hpb=701dbdf7fc4979f05fde1c655b17ca3aff0a59e0;p=friendica.git diff --git a/src/Module/Search/Acl.php b/src/Module/Search/Acl.php index 2c0cc967c0..9f072b91c9 100644 --- a/src/Module/Search/Acl.php +++ b/src/Module/Search/Acl.php @@ -1,6 +1,6 @@ getLocalUserId()) { throw new HTTPException\UnauthorizedException(DI::l10n()->t('You must be logged in to use this module.')); } $type = $_REQUEST['type'] ?? self::TYPE_MENTION_CONTACT_GROUP; - if ($type === self::TYPE_GLOBAL_CONTACT) { $o = self::globalContactSearch(); } else { $o = self::regularContactSearch($type); } - echo json_encode($o); - exit; + System::jsonExit($o); } - private static function globalContactSearch() + private static function globalContactSearch(): array { // autocomplete for global contact search (e.g. navbar search) - $search = Strings::escapeTags(trim($_REQUEST['search'])); + $search = trim($_REQUEST['search']); $mode = $_REQUEST['smode']; $page = $_REQUEST['page'] ?? 1; - $r = Search::searchGlobalContact($search, $mode, $page); + $result = Search::searchContact($search, $mode, $page); $contacts = []; - foreach ($r as $g) { - if (empty($g['name'])) { - DI::logger()->warning('Wrong result item from Search::searchGlobalContact', ['$g' => $g, '$search' => $search, '$mode' => $mode, '$page' => $page]); - continue; - } - + foreach ($result as $contact) { $contacts[] = [ - 'photo' => ProxyUtils::proxifyUrl($g['photo'], false, ProxyUtils::SIZE_MICRO), - 'name' => htmlspecialchars($g['name']), - 'nick' => $g['addr'] ?: $g['url'], - 'network' => $g['network'], - 'link' => $g['url'], - 'forum' => !empty($g['community']) ? 1 : 0, + 'photo' => Contact::getMicro($contact, true), + 'name' => htmlspecialchars($contact['name']), + 'nick' => $contact['addr'] ?: $contact['url'], + 'network' => $contact['network'], + 'link' => $contact['url'], + 'forum' => $contact['contact-type'] == Contact::TYPE_COMMUNITY, ]; } @@ -103,7 +95,7 @@ class Acl extends BaseModule return $o; } - private static function regularContactSearch(string $type) + private static function regularContactSearch(string $type): array { $start = $_REQUEST['start'] ?? 0; $count = $_REQUEST['count'] ?? 100; @@ -118,79 +110,56 @@ class Acl extends BaseModule $search = $_REQUEST['query']; } - Logger::info('ACL {action} - {subaction}', ['module' => 'acl', 'action' => 'content', 'subaction' => 'search', 'search' => $search, 'type' => $type, 'conversation' => $conv_id]); + Logger::info('ACL {action} - {subaction} - start', ['module' => 'acl', 'action' => 'content', 'subaction' => 'search', 'search' => $search, 'type' => $type, 'conversation' => $conv_id]); $sql_extra = ''; - $sql_extra2 = ''; + $condition = ["`uid` = ? AND NOT `deleted` AND NOT `pending` AND NOT `archive`", DI::userSession()->getLocalUserId()]; + $condition_group = ["`uid` = ? AND NOT `deleted`", DI::userSession()->getLocalUserId()]; if ($search != '') { $sql_extra = "AND `name` LIKE '%%" . DBA::escape($search) . "%%'"; - $sql_extra2 = "AND (`attag` LIKE '%%" . DBA::escape($search) . "%%' OR `name` LIKE '%%" . DBA::escape($search) . "%%' OR `nick` LIKE '%%" . DBA::escape($search) . "%%')"; + $condition = DBA::mergeConditions($condition, ["(`attag` LIKE ? OR `name` LIKE ? OR `nick` LIKE ?)", + '%' . $search . '%', '%' . $search . '%', '%' . $search . '%']); + $condition_group = DBA::mergeConditions($condition_group, ["`name` LIKE ?", '%' . $search . '%']); } // count groups and contacts $group_count = 0; if ($type == self::TYPE_MENTION_CONTACT_GROUP || $type == self::TYPE_MENTION_GROUP) { - $r = q("SELECT COUNT(*) AS g FROM `group` WHERE NOT `deleted` AND `uid` = %d $sql_extra", - intval(local_user()) - ); - $group_count = (int) $r[0]['g']; + $group_count = DBA::count('group', $condition_group); } - $sql_extra2 .= ' ' . Widget::unavailableNetworks(); + $networks = Widget::unavailableNetworks(); + $condition = DBA::mergeConditions($condition, array_merge(["NOT `network` IN (" . substr(str_repeat("?, ", count($networks)), 0, -2) . ")"], $networks)); - $contact_count = 0; switch ($type) { case self::TYPE_MENTION_CONTACT_GROUP: + $condition = DBA::mergeConditions($condition, + ["NOT `self` AND NOT `blocked` AND `notify` != ? AND `network` != ?", '', Protocol::OSTATUS + ]); + break; + case self::TYPE_MENTION_CONTACT: - // autocomplete for editor mentions - $r = q("SELECT COUNT(*) AS c FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `deleted` - AND NOT `blocked` AND NOT `pending` AND NOT `archive` - AND `notify` != '' $sql_extra2", - intval(local_user()) - ); - $contact_count = (int) $r[0]['c']; + $condition = DBA::mergeConditions($condition, + ["NOT `self` AND NOT `blocked` AND `notify` != ?", '' + ]); break; case self::TYPE_MENTION_FORUM: - // autocomplete for editor mentions of forums - $r = q("SELECT COUNT(*) AS c FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `deleted` - AND NOT `blocked` AND NOT `pending` AND NOT `archive` - AND (`forum` OR `prv`) - AND `notify` != '' $sql_extra2", - intval(local_user()) - ); - $contact_count = (int) $r[0]['c']; + $condition = DBA::mergeConditions($condition, + ["NOT `self` AND NOT `blocked` AND `notify` != ? AND `contact-type` = ?", '', Contact::TYPE_COMMUNITY + ]); break; case self::TYPE_PRIVATE_MESSAGE: - // autocomplete for Private Messages - $r = q("SELECT COUNT(*) AS c FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `deleted` - AND NOT `blocked` AND NOT `pending` AND NOT `archive` - AND `network` IN ('%s', '%s', '%s') $sql_extra2", - intval(local_user()), - DBA::escape(Protocol::ACTIVITYPUB), - DBA::escape(Protocol::DFRN), - DBA::escape(Protocol::DIASPORA) - ); - $contact_count = (int) $r[0]['c']; - break; - - case self::TYPE_ANY_CONTACT: - default: - // autocomplete for Contacts - $r = q("SELECT COUNT(*) AS c FROM `contact` - WHERE `uid` = %d AND NOT `self` - AND NOT `pending` AND NOT `deleted` $sql_extra2", - intval(local_user()) - ); - $contact_count = (int) $r[0]['c']; + $condition = DBA::mergeConditions($condition, + ["NOT `self` AND NOT `blocked` AND `notify` != ? AND `network` IN (?, ?, ?)", '', Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA + ]); break; } + $contact_count = DBA::count('contact', $condition); + $tot = $group_count + $contact_count; $groups = []; @@ -199,18 +168,18 @@ class Acl extends BaseModule if ($type == self::TYPE_MENTION_CONTACT_GROUP || $type == self::TYPE_MENTION_GROUP) { /// @todo We should cache this query. // This can be done when we can delete cache entries via wildcard - $r = q("SELECT `group`.`id`, `group`.`name`, GROUP_CONCAT(DISTINCT `group_member`.`contact-id` SEPARATOR ',') AS uids + $r = DBA::toArray(DBA::p("SELECT `group`.`id`, `group`.`name`, GROUP_CONCAT(DISTINCT `group_member`.`contact-id` SEPARATOR ',') AS uids FROM `group` INNER JOIN `group_member` ON `group_member`.`gid`=`group`.`id` - WHERE NOT `group`.`deleted` AND `group`.`uid` = %d + WHERE NOT `group`.`deleted` AND `group`.`uid` = ? $sql_extra GROUP BY `group`.`name`, `group`.`id` ORDER BY `group`.`name` - LIMIT %d, %d", - intval(local_user()), - intval($start), - intval($count) - ); + LIMIT ?, ?", + DI::userSession()->getLocalUserId(), + $start, + $count + )); foreach ($r as $g) { $groups[] = [ @@ -229,64 +198,8 @@ class Acl extends BaseModule } $r = []; - switch ($type) { - case self::TYPE_MENTION_CONTACT_GROUP: - $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv`, (`prv` OR `forum`) AS `frm` FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != '' - AND NOT (`network` IN ('%s', '%s')) - $sql_extra2 - ORDER BY `name`", - intval(local_user()), - DBA::escape(Protocol::OSTATUS), - DBA::escape(Protocol::STATUSNET) - ); - break; - - case self::TYPE_MENTION_CONTACT: - $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != '' - AND NOT (`network` IN ('%s')) - $sql_extra2 - ORDER BY `name`", - intval(local_user()), - DBA::escape(Protocol::STATUSNET) - ); - break; - - case self::TYPE_MENTION_FORUM: - $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `notify` != '' - AND NOT (`network` IN ('%s')) - AND (`forum` OR `prv`) - $sql_extra2 - ORDER BY `name`", - intval(local_user()), - DBA::escape(Protocol::STATUSNET) - ); - break; - - case self::TYPE_PRIVATE_MESSAGE: - $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr` FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `deleted` AND NOT `blocked` AND NOT `pending` AND NOT `archive` - AND `network` IN ('%s', '%s', '%s') - $sql_extra2 - ORDER BY `name`", - intval(local_user()), - DBA::escape(Protocol::ACTIVITYPUB), - DBA::escape(Protocol::DFRN), - DBA::escape(Protocol::DIASPORA) - ); - break; - - case self::TYPE_ANY_CONTACT: - default: - $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr`, `forum`, `prv` FROM `contact` - WHERE `uid` = %d AND NOT `deleted` AND NOT `pending` AND NOT `archive` - $sql_extra2 - ORDER BY `name`", - intval(local_user()) - ); - break; + if ($type != self::TYPE_MENTION_GROUP) { + $r = Contact::selectToArray([], $condition, ['order' => ['name']]); } if (DBA::isResult($r)) { @@ -294,14 +207,14 @@ class Acl extends BaseModule foreach ($r as $g) { $entry = [ 'type' => 'c', - 'photo' => Contact::getMicro($g), + 'photo' => Contact::getMicro($g, true), 'name' => htmlspecialchars($g['name']), 'id' => intval($g['id']), 'network' => $g['network'], 'link' => $g['url'], 'nick' => htmlentities(($g['attag'] ?? '') ?: $g['nick']), 'addr' => htmlentities(($g['addr'] ?? '') ?: $g['url']), - 'forum' => !empty($g['forum']) || !empty($g['prv']) ? 1 : 0, + 'forum' => $g['contact-type'] == Contact::TYPE_COMMUNITY, ]; if ($entry['forum']) { $forums[] = $entry; @@ -321,7 +234,7 @@ class Acl extends BaseModule if ($conv_id) { // In multi threaded posts the conv_id is not the parent of the whole thread - $parent_item = Item::selectFirst(['parent'], ['id' => $conv_id]); + $parent_item = Post::selectFirst(['parent'], ['id' => $conv_id]); if (DBA::isResult($parent_item)) { $conv_id = $parent_item['parent']; } @@ -338,9 +251,9 @@ class Acl extends BaseModule $condition = ["`parent` = ?", $conv_id]; $params = ['order' => ['author-name' => true]]; - $authors = Item::selectForUser(local_user(), ['author-link'], $condition, $params); + $authors = Post::selectForUser(DI::userSession()->getLocalUserId(), ['author-link'], $condition, $params); $item_authors = []; - while ($author = Item::fetch($authors)) { + while ($author = Post::fetch($authors)) { $item_authors[$author['author-link']] = $author['author-link']; } DBA::close($authors); @@ -350,14 +263,14 @@ class Acl extends BaseModule continue; } - $contact = Contact::getByURL($author, false, ['micro', 'name', 'id', 'network', 'nick', 'addr', 'url', 'forum']); + $contact = Contact::getByURL($author, false, ['micro', 'name', 'id', 'network', 'nick', 'addr', 'url', 'forum', 'avatar']); if (count($contact) > 0) { $unknown_contacts[] = [ 'type' => 'c', - 'photo' => Contact::getMicro($contact), + 'photo' => Contact::getMicro($contact, true), 'name' => htmlspecialchars($contact['name']), - 'id' => intval($contact['cid']), + 'id' => intval($contact['id']), 'network' => $contact['network'], 'link' => $contact['url'], 'nick' => htmlentities(($contact['nick'] ?? '') ?: $contact['addr']), @@ -391,6 +304,7 @@ class Acl extends BaseModule 'items' => $results['items'], ]; + Logger::info('ACL {action} - {subaction} - done', ['module' => 'acl', 'action' => 'content', 'subaction' => 'search', 'search' => $search, 'type' => $type, 'conversation' => $conv_id]); return $o; } }