up
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user