From d2237a54e4e91c37bdc8ecbbc1d8ba4655ae7280 Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Fri, 29 May 2026 00:37:58 +0300 Subject: [PATCH] add new features like realtime 2026-05-29-00 --- git_push.sh | 0 ride/call/driver/create_call_session.php | 120 +++++++++++++++++++ ride/call/passenger/create_call_session.php | 125 ++++++++++++++++++++ 3 files changed, 245 insertions(+) mode change 100644 => 100755 git_push.sh create mode 100644 ride/call/driver/create_call_session.php create mode 100644 ride/call/passenger/create_call_session.php diff --git a/git_push.sh b/git_push.sh old mode 100644 new mode 100755 diff --git a/ride/call/driver/create_call_session.php b/ride/call/driver/create_call_session.php new file mode 100644 index 0000000..b340581 --- /dev/null +++ b/ride/call/driver/create_call_session.php @@ -0,0 +1,120 @@ +prepare(" + SELECT r.id, r.passenger_id, d.name as driver_name + FROM ride r + JOIN driver d ON d.id = r.driver_id + WHERE r.id = :rid AND r.driver_id = :did AND r.status IN ('accepted', 'arrived', 'started', 'begin') + LIMIT 1 + "); + $stmt->execute([':rid' => $rideId, ':did' => $jwt->user_id]); + $ride = $stmt->fetch(); + + if (!$ride) { + printFailure('No active ride found matching request', 404); + exit; + } + + $passengerId = $ride['passenger_id']; + $callerName = trim($ride['driver_name']); + + // 2. Query Node.js signaling server to establish session + $url = (getenv('VOICE_CALL_SERVER_URL') ?: 'https://calls.intaleqapp.com') . '/sessions'; + $apiKey = getenv('VOICE_CALL_API_KEY') ?: ''; + + $ch = curl_init($url); + $payload = json_encode([ + 'ride_id' => (string)$rideId, + 'driver_id' => (string)$jwt->user_id, + 'passenger_id' => (string)$passengerId + ]); + + curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => $payload, + CURLOPT_HTTPHEADER => [ + "x-api-key: $apiKey", + "Content-Type: application/json" + ], + CURLOPT_TIMEOUT => 5, + CURLOPT_SSL_VERIFYPEER => false + ]); + + $result = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode !== 200) { + error_log("[driver_create_call_session.php] Signaling server session mapping failed: $result (HTTP $httpCode)"); + printFailure('Signaling server error', 502); + exit; + } + + $sessionData = json_decode($result, true); + if (!isset($sessionData['session_id'])) { + printFailure('Invalid response schema from signaling server'); + exit; + } + + $sessionId = $sessionData['session_id']; + + // 3. Dispatch data-only FCM call trigger to Passenger + $stmtToken = $con->prepare(" + SELECT token + FROM tokens + WHERE passengerID = :pid + ORDER BY id DESC + LIMIT 1 + "); + $stmtToken->execute([':pid' => $passengerId]); + $passengerTokenRow = $stmtToken->fetch(); + + if ($passengerTokenRow && !empty($passengerTokenRow['token'])) { + sendFCMData( + $passengerTokenRow['token'], + 'Incoming Call', + 'Incoming WebRTC voice call', + [ + 'type' => 'incoming_call', + 'session_id' => (string)$sessionId, + 'caller_name' => $callerName, + 'caller_avatar' => '', + 'ride_id' => (string)$rideId + ], + 'Call' + ); + } + + printSuccess('Call session created successfully', [ + 'session_id' => $sessionId, + 'expires_in' => $sessionData['expires_in'] ?? 60 + ]); + +} catch (Throwable $e) { + error_log("[driver_create_call_session.php] Critical exception: " . $e->getMessage()); + printFailure('Server error', 500); +} diff --git a/ride/call/passenger/create_call_session.php b/ride/call/passenger/create_call_session.php new file mode 100644 index 0000000..a880798 --- /dev/null +++ b/ride/call/passenger/create_call_session.php @@ -0,0 +1,125 @@ +prepare(" + SELECT r.id, r.driver_id, p.first_name, p.last_name + FROM ride r + JOIN passengers p ON p.id = r.passenger_id + WHERE r.id = :rid AND r.passenger_id = :pid AND r.status IN ('accepted', 'arrived', 'started', 'begin') + LIMIT 1 + "); + $stmt->execute([':rid' => $rideId, ':pid' => $jwt->user_id]); + $ride = $stmt->fetch(); + + if (!$ride) { + printFailure('No active ride found matching request', 404); + exit; + } + + $driverId = $ride['driver_id']; + if (empty($driverId) || $driverId === 'yet') { + printFailure('No driver accepted this ride yet', 400); + exit; + } + + $callerName = trim($ride['first_name'] . ' ' . $ride['last_name']); + + // 2. Query Node.js signaling server to establish session + $url = (getenv('VOICE_CALL_SERVER_URL') ?: 'https://calls.intaleqapp.com') . '/sessions'; + $apiKey = getenv('VOICE_CALL_API_KEY') ?: ''; + + $ch = curl_init($url); + $payload = json_encode([ + 'ride_id' => (string)$rideId, + 'driver_id' => (string)$driverId, + 'passenger_id' => (string)$jwt->user_id + ]); + + curl_setopt_array($ch, [ + CURLOPT_POST => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => $payload, + CURLOPT_HTTPHEADER => [ + "x-api-key: $apiKey", + "Content-Type: application/json" + ], + CURLOPT_TIMEOUT => 5, + CURLOPT_SSL_VERIFYPEER => false + ]); + + $result = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode !== 200) { + error_log("[passenger_create_call_session.php] Signaling server session mapping failed: $result (HTTP $httpCode)"); + printFailure('Signaling server error', 502); + exit; + } + + $sessionData = json_decode($result, true); + if (!isset($sessionData['session_id'])) { + printFailure('Invalid response schema from signaling server'); + exit; + } + + $sessionId = $sessionData['session_id']; + + // 3. Dispatch data-only FCM call trigger to Driver + $stmtToken = $con->prepare(" + SELECT token + FROM driverToken + WHERE captain_id = :did + ORDER BY created_at DESC + LIMIT 1 + "); + $stmtToken->execute([':did' => $driverId]); + $driverTokenRow = $stmtToken->fetch(); + + if ($driverTokenRow && !empty($driverTokenRow['token'])) { + sendFCMData( + $driverTokenRow['token'], + 'Incoming Call', + 'Incoming WebRTC voice call', + [ + 'type' => 'incoming_call', + 'session_id' => (string)$sessionId, + 'caller_name' => $callerName, + 'caller_avatar' => '', + 'ride_id' => (string)$rideId + ], + 'Call' + ); + } + + printSuccess('Call session created successfully', [ + 'session_id' => $sessionId, + 'expires_in' => $sessionData['expires_in'] ?? 60 + ]); + +} catch (Throwable $e) { + error_log("[passenger_create_call_session.php] Critical exception: " . $e->getMessage()); + printFailure('Server error', 500); +}