getMessage()); } $ride_id = filterRequest("id"); $driver_id = filterRequest("driver_id"); $status = filterRequest("status"); // 'Begin' $passengerToken = filterRequest("passengerToken"); if (!$ride_id || !$driver_id || !$status) { jsonError("Missing parameters"); exit; } try { // 1. تحديث سيرفر الرحلات (Remote DB - con_ride) $stmtRemote = $con_ride->prepare("UPDATE ride SET status = ?, rideTimeStart = NOW() WHERE id = ?"); $stmtRemote->execute([$status, $ride_id]); if ($stmtRemote->rowCount() == 0) { // ملاحظة: أحياناً التحديث لا يؤثر بصفوف إذا كانت البيانات نفسها، // لكن هنا نفترض الفشل إذا لم يجد الرحلة. // يمكنك إكمال التنفيذ إذا كنت متأكداً أن الرحلة موجودة. } // 2. تحديث السيرفر المحلي (Local DB) والمعاملات $con->beginTransaction(); // تحديث الرحلة محلياً $stmtMainRide = $con->prepare("UPDATE ride SET status = ?, rideTimeStart = NOW() WHERE id = ?"); $stmtMainRide->execute([$status, $ride_id]); // تحديث أو إدخال في جدول Driver Orders $checkSql = "SELECT `order_id` FROM `driver_orders` WHERE `order_id` = ?"; $checkStmt = $con->prepare($checkSql); $checkStmt->execute([$ride_id]); if ($checkStmt->rowCount() > 0) { $updateSql = "UPDATE `driver_orders` SET `driver_id` = ?, `status` = ?, `created_at` = NOW() WHERE `order_id` = ?"; $con->prepare($updateSql)->execute([$driver_id, $status, $ride_id]); } else { $insertSql = "INSERT INTO `driver_orders` (`driver_id`, `order_id`, `created_at`, `status`) VALUES (?, ?, NOW(), ?)"; $con->prepare($insertSql)->execute([$driver_id, $ride_id, $status]); } // ================================================================= // 🔥 الخطوة 3: إشعار الراكب (Socket + FCM) // ================================================================= // جلب بيانات الراكب من قاعدة البيانات لضمان الدقة $stmtPas = $con_ride->prepare("SELECT passenger_id FROM ride WHERE id = ?"); $stmtPas->execute([$ride_id]); $passenger_id = $stmtPas->fetchColumn(); if ($passenger_id) { // أ) إرسال السوكيت (Socket) // تم إلغاء التعليق عنه ليكون السيرفر هو المسؤول $socketPayload = [ 'ride_id' => $ride_id, 'status' => 'started', // أو 'Begin' حسب ما يتوقعه التطبيق 'msg' => 'بدأت الرحلة، نتمنى لك سلامة الوصول 🚀' ]; if (function_exists('notifyPassengerOnRideServer')) { notifyPassengerOnRideServer($passenger_id, $socketPayload); } // ب) إرسال FCM (Internal) if (!empty($passengerToken)) { $fcmData = [ 'ride_id' => (string)$ride_id ]; // 🔥 استخدام sendFCM_Internal كرسالة صامتة sendFCM_Internal( $passengerToken, // الهدف "", // تفريغ العنوان "", // تفريغ النص $fcmData, // البيانات "Trip is Begin", // التصنيف false // ليس Topic ); } } $con->commit(); jsonSuccess(null, "Ride started successfully"); } catch (PDOException $e) { if ($con->inTransaction()) { $con->rollBack(); } jsonError("Exception: " . $e->getMessage()); } ?>