This commit is contained in:
Lizandro Guarnizo
2026-02-03 21:30:55 -05:00
parent 44423adb32
commit 1aae148396
89 changed files with 8581 additions and 7687 deletions
+86 -7
View File
@@ -25,6 +25,9 @@ try {
$limit = max(1, min(200, $limit)); // máximo 200 por página
$page = isset($_GET['page']) ? max(1, intval($_GET['page'])) : 1;
$offset = ($page - 1) * $limit;
// Parámetro de búsqueda
$search = isset($_GET['search']) ? trim($_GET['search']) : '';
// Obtener conversaciones agregadas por usuario: último mensaje + conteo de no leídos + avatar
$filter = isset($_GET['filter']) ? strtolower(trim($_GET['filter'])) : 'all';
@@ -47,7 +50,19 @@ try {
lm.local_file AS last_local_file,
lm.local_thumb AS last_local_thumb,
lm.created_at AS last_time,
IFNULL(SUM(CASE WHEN c.direction = 'incoming' AND (c.is_read IS NULL OR c.is_read = 0) THEN 1 ELSE 0 END), 0) AS unread_count
IFNULL(SUM(CASE WHEN c.direction = 'incoming' AND (c.is_read IS NULL OR c.is_read = 0) THEN 1 ELSE 0 END), 0) AS unread_count";
// Si hay búsqueda, agregar campo para ordenar por relevancia
if (!empty($search)) {
$sql .= ",
(CASE
WHEN u.name LIKE ? THEN 3
WHEN u.phone_number LIKE ? THEN 2
ELSE 1
END) AS relevance";
}
$sql .= "
FROM users u
LEFT JOIN conversations c ON c.user_id = u.id
LEFT JOIN (
@@ -55,7 +70,23 @@ try {
JOIN (
SELECT user_id, MAX(created_at) AS last_time FROM conversations GROUP BY user_id
) t2 ON t1.user_id = t2.user_id AND t1.created_at = t2.last_time
) lm ON lm.user_id = u.id
) lm ON lm.user_id = u.id";
// Agregar condición de búsqueda si existe
if (!empty($search)) {
$sql .= "
WHERE (
u.name LIKE ?
OR u.phone_number LIKE ?
OR EXISTS (
SELECT 1 FROM conversations c2
WHERE c2.user_id = u.id
AND c2.content LIKE ?
)
)";
}
$sql .= "
GROUP BY u.id";
// Aplicar filtro 'unread' si se solicita
@@ -63,15 +94,63 @@ try {
$sql .= " HAVING IFNULL(SUM(CASE WHEN c.direction = 'incoming' AND (c.is_read IS NULL OR c.is_read = 0) THEN 1 ELSE 0 END), 0) > 0";
}
$sql .= "\n ORDER BY lm.created_at DESC\n LIMIT %d OFFSET %d";
// Ordenar por relevancia si hay búsqueda, sino por fecha
if (!empty($search)) {
$sql .= "\n ORDER BY relevance DESC, lm.created_at DESC";
} else {
$sql .= "\n ORDER BY lm.created_at DESC";
}
$sql .= "\n LIMIT %d OFFSET %d";
$conversations = $db->fetchAll(sprintf($sql, $limit, $offset));
// Preparar parámetros para la consulta
$params = [];
if (!empty($search)) {
$searchParam = '%' . $search . '%';
// Para el campo de relevancia
$params[] = $searchParam; // name LIKE
$params[] = $searchParam; // phone_number LIKE
// Para el WHERE
$params[] = $searchParam; // name LIKE
$params[] = $searchParam; // phone_number LIKE
$params[] = $searchParam; // content LIKE
}
$finalSql = sprintf($sql, $limit, $offset);
if (!empty($params)) {
$conversations = $db->fetchAll($finalSql, $params);
} else {
$conversations = $db->fetchAll($finalSql);
}
// Conteo total de usuarios con al menos una conversación (útil para paginar)
if ($filter === 'unread') {
$totalRow = $db->fetch("SELECT COUNT(DISTINCT user_id) AS count FROM conversations c WHERE c.direction = 'incoming' AND (c.is_read IS NULL OR c.is_read = 0)");
if (!empty($search)) {
// Conteo con búsqueda
$searchParam = '%' . $search . '%';
$countSql = "SELECT COUNT(DISTINCT u.id) AS count
FROM users u
LEFT JOIN conversations c ON c.user_id = u.id
WHERE (
u.name LIKE ?
OR u.phone_number LIKE ?
OR EXISTS (
SELECT 1 FROM conversations c2
WHERE c2.user_id = u.id
AND c2.content LIKE ?
)
)";
if ($filter === 'unread') {
$countSql .= " AND c.direction = 'incoming' AND (c.is_read IS NULL OR c.is_read = 0)";
}
$totalRow = $db->fetch($countSql, [$searchParam, $searchParam, $searchParam]);
} else {
$totalRow = $db->fetch("SELECT COUNT(DISTINCT user_id) AS count FROM conversations");
// Conteo normal sin búsqueda
if ($filter === 'unread') {
$totalRow = $db->fetch("SELECT COUNT(DISTINCT user_id) AS count FROM conversations c WHERE c.direction = 'incoming' AND (c.is_read IS NULL OR c.is_read = 0)");
} else {
$totalRow = $db->fetch("SELECT COUNT(DISTINCT user_id) AS count FROM conversations");
}
}
$total = isset($totalRow['count']) ? intval($totalRow['count']) : 0;