147 lines
5.3 KiB
PHP
Executable File
147 lines
5.3 KiB
PHP
Executable File
<?php
|
|
require_once __DIR__ . '/../../connect.php';
|
|
|
|
try {
|
|
$con_ride = Database::get('ride');
|
|
} catch (Exception $e) {
|
|
error_log("[cancel_ride_by_passenger] Failed to connect to Ride Database: " . $e->getMessage());
|
|
}
|
|
|
|
// cancel_ride_by_passenger.php
|
|
|
|
$rideId = filterRequest("ride_id");
|
|
$reason = filterRequest("reason");
|
|
|
|
if (!$rideId) {
|
|
jsonError("Missing Ride ID");
|
|
exit;
|
|
}
|
|
|
|
try {
|
|
// جلب بيانات الرحلة للتحقق
|
|
$stmt = $con->prepare("SELECT driver_id, status FROM ride WHERE id = ?");
|
|
$stmt->execute([$rideId]);
|
|
$ride = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
if (!$ride) {
|
|
jsonError("Ride not found");
|
|
exit;
|
|
}
|
|
|
|
$driverId = $ride['driver_id'];
|
|
$currentStatus = $ride['status'];
|
|
|
|
if ($currentStatus == 'Begin') {
|
|
jsonError("Cannot cancel started ride");
|
|
exit;
|
|
}
|
|
|
|
// =================================================================
|
|
// 1. تحديث قواعد البيانات (Transaction)
|
|
// =================================================================
|
|
$con->beginTransaction();
|
|
|
|
// تحديث waitingRides
|
|
$updateWaiting = $con->prepare("UPDATE waitingRides SET status = ? WHERE id = ?");
|
|
$updateWaiting->execute(['cancelled_by_passenger', $rideId]);
|
|
|
|
// تحديث ride (محلي)
|
|
$updateRide = $con->prepare("UPDATE ride SET status = ?, updated_at = NOW() WHERE id = ?");
|
|
$updateRide->execute(['cancelled_by_passenger', $rideId]);
|
|
|
|
// تحديث driver_orders
|
|
if ($driverId > 0) {
|
|
$updateOrder = $con->prepare("UPDATE driver_orders SET status = 'cancelled_by_passenger', notes = ? WHERE order_id = ? AND driver_id = ?");
|
|
$updateOrder->execute([$reason, $rideId, $driverId]);
|
|
}
|
|
|
|
$con->commit();
|
|
|
|
// تحديث السيرفر البعيد (Remote DB)
|
|
if (isset($con_ride)) {
|
|
try {
|
|
$updateRide2 = $con_ride->prepare("UPDATE ride SET status = ?, updated_at = NOW() WHERE id = ?");
|
|
$updateRide2->execute(['cancelled_by_passenger', $rideId]);
|
|
} catch (PDOException $e) {
|
|
error_log("Secondary DB update failed: " . $e->getMessage());
|
|
}
|
|
}
|
|
|
|
// =================================================================
|
|
// 2. إشعار السائق (Socket + FCM)
|
|
// =================================================================
|
|
if ($driverId > 0) {
|
|
|
|
// أ) Socket (إشعار السائق في التطبيق فوراً)
|
|
$socketUrl = 'http://188.68.36.205:2021';
|
|
$internalKeyPath = '/home/siro-api/.internal_socket_key';
|
|
$internalKey = file_exists($internalKeyPath) ? trim(file_get_contents($internalKeyPath)) : '';
|
|
|
|
$ch = curl_init($socketUrl);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_POST, true);
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
|
|
'action' => 'cancel_ride',
|
|
'driver_id' => $driverId,
|
|
'ride_id' => $rideId,
|
|
'reason' => $reason
|
|
]));
|
|
if (!empty($internalKey)) curl_setopt($ch, CURLOPT_HTTPHEADER, ["x-internal-key: $internalKey"]);
|
|
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 500);
|
|
curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
|
|
@curl_exec($ch);
|
|
curl_close($ch);
|
|
|
|
// ب) FCM (باستخدام الدالة الجديدة مع فك التشفير)
|
|
$driverToken = filterRequest("driver_token");
|
|
|
|
if (empty($driverToken)) {
|
|
$stmtToken = $con->prepare("SELECT token FROM driverToken WHERE captain_id = ?");
|
|
$stmtToken->execute([$driverId]);
|
|
$rawToken = $stmtToken->fetchColumn();
|
|
|
|
if ($rawToken) {
|
|
$driverToken = $rawToken;
|
|
|
|
// 🔥 محاولة فك التشفير (لأن التوكنات غالباً مشفرة)
|
|
if (!empty($encryptionHelper)) {
|
|
try {
|
|
$decrypted = $encryptionHelper->decryptData($rawToken);
|
|
if ($decrypted !== false && !empty($decrypted)) {
|
|
$driverToken = trim($decrypted);
|
|
}
|
|
} catch (Exception $e) {
|
|
// في حال الفشل نستخدم الخام
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!empty($driverToken)) {
|
|
// تجهيز البيانات
|
|
$fcmData = [
|
|
'category' => 'Cancel Trip',
|
|
'ride_id' => (string)$rideId,
|
|
'reason' => $reason
|
|
];
|
|
|
|
// إرسال الإشعار
|
|
sendFCM_Internal(
|
|
$driverToken, // الهدف
|
|
"إلغاء الرحلة 🚫", // العنوان
|
|
"قام الراكب بإلغاء الرحلة: $reason", // النص
|
|
$fcmData, // البيانات
|
|
'Cancel Trip', // التصنيف
|
|
false // ليس Topic
|
|
);
|
|
}
|
|
}
|
|
|
|
jsonSuccess(null, "Ride cancelled successfully");
|
|
|
|
} catch (PDOException $e) {
|
|
if ($con->inTransaction()) $con->rollBack();
|
|
error_log("Cancel ride error: " . $e->getMessage());
|
|
jsonError("Database error occurred");
|
|
}
|
|
?>
|