This commit is contained in:
Lizandro Guarnizo
2026-02-20 09:07:37 -05:00
parent 276af13387
commit 421a5a4d7c
10 changed files with 921 additions and 5 deletions
+55 -1
View File
@@ -209,12 +209,54 @@ class WhatsAppWebhook {
$mimeType = $message['document']['mime_type'] ?? null;
$filename = $message['document']['filename'] ?? null;
// Do NOT download documents automatically; keep media id so browser will redirect and download
}
// Log debug (temporal) para verificar cómo llegan media_url/filename
error_log(sprintf('[webhook] messageId=%s type=%s mediaUrl=%s filename=%s mime=%s', $messageId, $messageType, $mediaUrl ?? 'NULL', $filename ?? 'NULL', $mimeType ?? 'NULL'));
// ── Descargar media localmente de inmediato ──
// Si hay un media ID (numérico) o URL de Graph, descargarlo y guardarlo en uploads/media/
$localFile = null;
$localThumb = null;
if (!empty($mediaUrl) && in_array($messageType, ['image', 'audio', 'video', 'document', 'sticker'])) {
try {
$mediaService = new MediaService();
$subdir = date('Y/m'); // Organizar por año/mes
// Determinar si es un media ID (numérico) o una URL directa
if (preg_match('/^\d+$/', $mediaUrl)) {
// Es un media ID de WhatsApp → resolver vía Graph API y descargar
$stored = $mediaService->fetchAndStoreFromGraph($mediaUrl, $subdir);
} else {
// Es una URL directa → descargar directamente
$stored = $mediaService->fetchAndStoreFromUrl($mediaUrl, $subdir);
}
if (!empty($stored['local_file'])) {
$localFile = $stored['local_file'];
error_log("[webhook] Media descargado localmente: {$localFile}");
}
if (!empty($stored['local_thumb'])) {
$localThumb = $stored['local_thumb'];
}
} catch (Exception $mediaEx) {
error_log("[webhook] Error descargando media (se encolará para retry): " . $mediaEx->getMessage());
// Encolar en media_queue para reintento posterior
try {
$this->db->insert('media_queue', [
'media_id' => preg_match('/^\d+$/', $mediaUrl) ? $mediaUrl : '',
'media_url' => $mediaUrl,
'subdir' => date('Y/m'),
'status' => 'pending',
'created_at' => date('Y-m-d H:i:s')
]);
error_log("[webhook] Media encolado en media_queue para retry");
} catch (Exception $qEx) {
error_log("[webhook] Error encolando media: " . $qEx->getMessage());
}
}
}
// Guardar mensaje en base de datos
$saveData = [
'user_id' => $user['id'],
@@ -291,6 +333,18 @@ class WhatsAppWebhook {
// Guardar mensaje y conservar el id de la conversación para posibles encolamientos
$conversationId = $this->saveMessage($saveData);
// Si el media se encoló (no se pudo descargar), actualizar media_queue con el conversation_id
if (!empty($mediaUrl) && empty($localFile) && in_array($messageType, ['image', 'audio', 'video', 'document', 'sticker'])) {
try {
$this->db->query(
"UPDATE media_queue SET conversation_id = :cid WHERE media_id = :mid AND conversation_id IS NULL ORDER BY id DESC LIMIT 1",
['cid' => $conversationId, 'mid' => (preg_match('/^\d+$/', $mediaUrl) ? $mediaUrl : '')]
);
} catch (Exception $e) {
error_log("[webhook] Error actualizando media_queue con conversation_id: " . $e->getMessage());
}
}
// Crear notificación para UI (nuevo mensaje entrante)
try {
$this->db->insert('notifications', [