This commit is contained in:
Lizandro Guarnizo
2026-01-27 14:51:41 -05:00
parent c1f3524466
commit 1f224044f7
21 changed files with 2997 additions and 47 deletions
+48
View File
@@ -305,6 +305,16 @@ class WhatsAppWebhook {
error_log('Failed to create notification: ' . $e->getMessage());
}
// Empujar evento SSE en tiempo real
$this->pushSSEEvent('new_message', [
'user_id' => $user['id'],
'phone_number' => $user['phone_number'],
'name' => $user['name'] ?? $from,
'message' => substr($messageText, 0, 250),
'message_type' => $messageType,
'timestamp' => date('Y-m-d H:i:s')
]);
// Procesar con bot (protección contra excepciones externas)
try {
$this->botService->processMessage($user, $messageText, $messageType);
@@ -398,6 +408,44 @@ class WhatsAppWebhook {
}
}
/**
* Empujar evento a través de SSE (Server-Sent Events)
* Notifica a todos los operadores conectados sobre nuevos eventos
*/
private function pushSSEEvent($eventType, $data) {
try {
// Llamar al endpoint push_event interno
$pushUrl = 'http://127.0.0.1' . dirname($_SERVER['SCRIPT_NAME']) . '/push_event.php';
$payload = json_encode([
'event_type' => $eventType,
'data' => $data,
'target_user_id' => 'all' // Notificar a todos los operadores
]);
// Hacer llamada asíncrona (fire and forget)
$ch = curl_init($pushUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT_MS => 500, // Timeout corto
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-Push-Token: internal_push_secret_2026'
]
]);
// Ejecutar sin bloquear
curl_exec($ch);
curl_close($ch);
} catch (Exception $e) {
// No fallar si el push falla
error_log('pushSSEEvent failed: ' . $e->getMessage());
}
}
/**
* Procesar un payload (array) recibido manualmente (replay)
* Útil para reproducir entradas desde la UI o scripts.