sadsd
All checks were successful
Deploy / deploy (push) Successful in 53s

This commit is contained in:
2026-08-17 00:39:46 +02:00
parent 0f57f90568
commit f7a6b34a97

View File

@@ -298,22 +298,16 @@ final class CommunityAccess
} }
$limit = max(1, min(50, $limit)); $limit = max(1, min(50, $limit));
$tokens = array_values(array_filter(preg_split('/\s+/u', mb_strtolower($query)) ?: [], static fn(string $token): bool => $token !== '')); $rowsById = [];
if ($tokens === []) {
return [];
}
$tokens = array_values(array_filter(preg_split('/\s+/u', mb_strtolower($query)) ?: [], static fn(string $token): bool => $token !== ''));
if ($tokens !== []) {
$conditions = []; $conditions = [];
$params = []; $params = [];
foreach ($tokens as $index => $token) { foreach ($tokens as $index => $token) {
$displayKey = ':display_' . $index; $displayKey = ':display_' . $index;
$nameKey = ':name_' . $index; $conditions[] = 'LOWER(COALESCE(up.display_name, "")) LIKE ' . $displayKey;
$emailKey = ':email_' . $index; $params[$displayKey] = '%' . $token . '%';
$conditions[] = '(LOWER(COALESCE(up.display_name, "")) LIKE ' . $displayKey . ' OR LOWER(CONCAT_WS(" ", COALESCE(up.first_name, ""), COALESCE(up.last_name, ""))) LIKE ' . $nameKey . ' OR LOWER(COALESCE(u.email, "")) LIKE ' . $emailKey . ')';
$needle = '%' . $token . '%';
$params[$displayKey] = $needle;
$params[$nameKey] = $needle;
$params[$emailKey] = $needle;
} }
$sql = ' $sql = '
@@ -324,18 +318,48 @@ final class CommunityAccess
ORDER BY ORDER BY
CASE CASE
WHEN LOWER(COALESCE(up.display_name, "")) = :exactDisplayQuery THEN 0 WHEN LOWER(COALESCE(up.display_name, "")) = :exactDisplayQuery THEN 0
WHEN LOWER(COALESCE(u.email, "")) = :exactEmailQuery THEN 1 ELSE 1
ELSE 2
END, END,
COALESCE(up.display_name, ""), COALESCE(up.display_name, ""),
u.id DESC u.id DESC
LIMIT ' . $limit; LIMIT ' . $limit;
$params[':exactDisplayQuery'] = mb_strtolower($query); $params[':exactDisplayQuery'] = mb_strtolower($query);
$params[':exactEmailQuery'] = mb_strtolower($query);
$stmt = $this->pdo->prepare($sql); $stmt = $this->pdo->prepare($sql);
$stmt->execute($params); $stmt->execute($params);
return $this->emailStore()->decryptRowEmails($stmt->fetchAll(\PDO::FETCH_ASSOC) ?: [], 'id'); foreach ($stmt->fetchAll(\PDO::FETCH_ASSOC) ?: [] as $row) {
$rowsById[(int)($row['id'] ?? 0)] = $row;
}
}
if (str_contains($query, '@')) {
$emailRow = $this->emailStore()->findUserByEmail($query, 'id, email, status');
if (is_array($emailRow)) {
$profileStmt = $this->pdo->prepare('SELECT display_name, first_name, last_name FROM user_profiles WHERE user_id = :uid LIMIT 1');
$profileStmt->execute(['uid' => (int)$emailRow['id']]);
$profileRow = $profileStmt->fetch(\PDO::FETCH_ASSOC) ?: [];
$emailRow['display_name'] = (string)($profileRow['display_name'] ?? '');
$emailRow['first_name'] = (string)($profileRow['first_name'] ?? '');
$emailRow['last_name'] = (string)($profileRow['last_name'] ?? '');
$rowsById[(int)$emailRow['id']] = $emailRow;
}
}
$rows = array_values($rowsById);
usort($rows, static function (array $left, array $right) use ($query): int {
$leftDisplay = mb_strtolower((string)($left['display_name'] ?? ''));
$rightDisplay = mb_strtolower((string)($right['display_name'] ?? ''));
$needle = mb_strtolower($query);
$leftRank = $leftDisplay === $needle ? 0 : 1;
$rightRank = $rightDisplay === $needle ? 0 : 1;
if ($leftRank !== $rightRank) {
return $leftRank <=> $rightRank;
}
return ((int)($right['id'] ?? 0)) <=> ((int)($left['id'] ?? 0));
});
$rows = array_slice($rows, 0, $limit);
return $this->emailStore()->decryptRowEmails($rows, 'id');
} }
public function setRestriction(int $actingUserId, int $targetUserId, string $type, string $reason): void public function setRestriction(int $actingUserId, int $targetUserId, string $type, string $reason): void