This commit is contained in:
Lizandro Guarnizo
2026-02-21 07:37:36 -05:00
parent 2f73ee2a1a
commit de4b07c806
14 changed files with 2001 additions and 23 deletions
+38 -6
View File
@@ -127,7 +127,8 @@ class OptimizedWebhook {
foreach ($entry['changes'] as $change) {
if (isset($change['value']['messages'])) {
$this->queueMessages($change['value']['messages']);
$contacts = $change['value']['contacts'] ?? [];
$this->queueMessages($change['value']['messages'], $contacts);
}
if (isset($change['value']['statuses'])) {
@@ -156,7 +157,17 @@ class OptimizedWebhook {
/**
* Encolar mensajes para procesamiento asíncrono
*/
private function queueMessages($messages) {
private function queueMessages($messages, $contacts = []) {
// Extraer nombres de contactos del payload
$contactNames = [];
foreach ($contacts as $contact) {
$waId = $contact['wa_id'] ?? null;
$name = $contact['profile']['name'] ?? null;
if ($waId && $name) {
$contactNames[$waId] = $name;
}
}
foreach ($messages as $message) {
try {
$messageId = $message['id'] ?? null;
@@ -178,9 +189,29 @@ class OptimizedWebhook {
// Obtener o crear usuario (rápido, solo DB lookup)
$user = $this->getUserByPhone($phoneNumber);
$contactName = $contactNames[$phoneNumber] ?? null;
if (!$user) {
$userId = $this->createUser($phoneNumber);
$user = $this->getUserById($userId);
// Guardar nombre del contacto de WhatsApp
if ($contactName && $userId) {
try {
$this->db->update('users', ['name' => $contactName], 'id = ? AND (name IS NULL OR name = ? OR name = ?)', [$userId, '', $phoneNumber]);
$user['name'] = $contactName;
} catch (Exception $e) {
$this->logger->warning('Error guardando nombre contacto: ' . $e->getMessage());
}
}
} else {
// Actualizar nombre si no tiene uno real (solo tiene el teléfono o vacío)
if ($contactName && (empty($user['name']) || $user['name'] === $phoneNumber)) {
try {
$this->db->update('users', ['name' => $contactName], 'id = ? AND (name IS NULL OR name = ? OR name = ?)', [$user['id'], '', $phoneNumber]);
$user['name'] = $contactName;
} catch (Exception $e) {
$this->logger->warning('Error actualizando nombre contacto: ' . $e->getMessage());
}
}
}
// Extraer tipo y contenido del mensaje
@@ -249,7 +280,8 @@ class OptimizedWebhook {
case 'image':
$text = $message['image']['caption'] ?? '';
$mediaUrl = $message['image']['url'] ?? $message['image']['id'] ?? null;
// Preferir media ID (estable) sobre URL (expira en minutos)
$mediaUrl = $message['image']['id'] ?? $message['image']['url'] ?? null;
// Encolar descarga de media
if ($mediaUrl) {
@@ -259,7 +291,7 @@ class OptimizedWebhook {
case 'video':
$text = $message['video']['caption'] ?? '';
$mediaUrl = $message['video']['url'] ?? $message['video']['id'] ?? null;
$mediaUrl = $message['video']['id'] ?? $message['video']['url'] ?? null;
if ($mediaUrl) {
$this->queueMediaDownload($mediaUrl, $message['id'], 'video');
@@ -267,7 +299,7 @@ class OptimizedWebhook {
break;
case 'audio':
$mediaUrl = $message['audio']['url'] ?? $message['audio']['id'] ?? null;
$mediaUrl = $message['audio']['id'] ?? $message['audio']['url'] ?? null;
if ($mediaUrl) {
$this->queueMediaDownload($mediaUrl, $message['id'], 'audio');
@@ -276,7 +308,7 @@ class OptimizedWebhook {
case 'document':
$text = $message['document']['filename'] ?? '';
$mediaUrl = $message['document']['url'] ?? $message['document']['id'] ?? null;
$mediaUrl = $message['document']['id'] ?? $message['document']['url'] ?? null;
if ($mediaUrl) {
$this->queueMediaDownload($mediaUrl, $message['id'], 'document');