first commit
This commit is contained in:
158
backend/ride/rides/getRideOrderID.php
Executable file
158
backend/ride/rides/getRideOrderID.php
Executable file
@@ -0,0 +1,158 @@
|
||||
<?php
|
||||
// نقوم بتضمين ملف الاتصال المعدل الذي يحتوي على $con (الرئيسي)
|
||||
require_once __DIR__ . '/../../connect.php';
|
||||
|
||||
// تهيئة اتصال قاعدة بيانات الرحلات
|
||||
try {
|
||||
$con_ride = Database::get('ride');
|
||||
} catch (Exception $e) {
|
||||
error_log("[getRideOrderID] Failed to connect to Ride Database: " . $e->getMessage());
|
||||
http_response_code(500);
|
||||
echo json_encode(["status" => "failure", "message" => "Database connection failed"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// استلام البيانات (يمكن استلام ID الرحلة أو ID الراكب)
|
||||
$passengerID = filterRequest("passengerID");
|
||||
$rideID = filterRequest("id"); // إضافة استقبال متغير رقم الرحلة
|
||||
|
||||
try {
|
||||
// =================================================================
|
||||
// 1. الخطوة الأولى: تحديد استراتيجية البحث (بواسطة رقم الرحلة أو الراكب)
|
||||
// =================================================================
|
||||
|
||||
$sqlRide = "SELECT
|
||||
id,
|
||||
start_location,
|
||||
end_location,
|
||||
date,
|
||||
driver_id,
|
||||
passenger_id,
|
||||
price,
|
||||
status,
|
||||
created_at,
|
||||
DriverIsGoingToPassenger,
|
||||
rideTimeStart,
|
||||
rideTimeFinish,
|
||||
price_for_driver,
|
||||
distance
|
||||
FROM ride ";
|
||||
|
||||
// المنطق الجديد:
|
||||
// إذا تم إرسال rideID، نبحث عن الرحلة المحددة بدقة (تجنباً لأي تضارب)
|
||||
// إذا لم يتم إرساله، نبحث عن أحدث رحلة للراكب (للتتبع المباشر)
|
||||
if (!empty($rideID)) {
|
||||
$sqlRide .= "WHERE id = :rideID";
|
||||
} else {
|
||||
$sqlRide .= "WHERE passenger_id = :passengerID ORDER BY id DESC LIMIT 1";
|
||||
}
|
||||
|
||||
// نستخدم المتغير $con_ride (سيرفر الرحلات)
|
||||
$stmtRide = $con_ride->prepare($sqlRide);
|
||||
|
||||
// ربط المتغيرات حسب نوع البحث
|
||||
if (!empty($rideID)) {
|
||||
$stmtRide->bindParam(':rideID', $rideID);
|
||||
} else {
|
||||
$stmtRide->bindParam(':passengerID', $passengerID);
|
||||
}
|
||||
|
||||
$stmtRide->execute();
|
||||
|
||||
$rideData = $stmtRide->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
// إذا لم يتم العثور على رحلة في سيرفر الرحلات، نوقف العملية
|
||||
if (!$rideData) {
|
||||
echo json_encode(["status" => "failure", "message" => "No ride found"]);
|
||||
exit;
|
||||
}
|
||||
|
||||
// =================================================================
|
||||
// 2. الخطوة الثانية: جلب البيانات الثابتة (سائق، سيارة، تقييم) من السيرفر الرئيسي ($con)
|
||||
// نستخدم المعرفات التي حصلنا عليها من نتيجة الاستعلام الأول
|
||||
// =================================================================
|
||||
|
||||
$driverID = $rideData['driver_id'];
|
||||
$pID = $rideData['passenger_id']; // نأخذ معرف الراكب من الرحلة نفسها لضمان التطابق
|
||||
|
||||
// ملاحظة: استخدام :driverID_Sub في الاستعلام الفرعي لتجنب أخطاء PDO
|
||||
$sqlDetails = "SELECT
|
||||
passengers.first_name AS passengerName,
|
||||
passengers.last_name,
|
||||
|
||||
CarRegistration.make,
|
||||
CarRegistration.model,
|
||||
CarRegistration.car_plate,
|
||||
CarRegistration.year,
|
||||
CarRegistration.color,
|
||||
CarRegistration.color_hex,
|
||||
|
||||
driver.first_name AS driverName,
|
||||
driver.gender,
|
||||
driver.phone,
|
||||
|
||||
(
|
||||
SELECT ROUND(AVG(ratingDriver.rating), 2)
|
||||
FROM ratingDriver
|
||||
WHERE ratingDriver.driver_id = :driverID_Sub
|
||||
) AS ratingDriver,
|
||||
|
||||
driverToken.token AS token
|
||||
|
||||
FROM driver
|
||||
LEFT JOIN passengers ON passengers.id = :passengerID
|
||||
LEFT JOIN CarRegistration ON CarRegistration.driverID = driver.id
|
||||
LEFT JOIN driverToken ON driverToken.captain_id = driver.id
|
||||
WHERE driver.id = :driverID";
|
||||
|
||||
// نستخدم المتغير الأصلي $con للسيرفر الرئيسي
|
||||
$stmtDetails = $con->prepare($sqlDetails);
|
||||
|
||||
// نربط المتغيرات
|
||||
$stmtDetails->bindParam(':driverID', $driverID);
|
||||
$stmtDetails->bindParam(':driverID_Sub', $driverID);
|
||||
$stmtDetails->bindParam(':passengerID', $pID);
|
||||
|
||||
$stmtDetails->execute();
|
||||
|
||||
$detailsData = $stmtDetails->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
// =================================================================
|
||||
// 3. الخطوة الثالثة: دمج البيانات وتجهيز الرد
|
||||
// =================================================================
|
||||
|
||||
$finalData = [];
|
||||
|
||||
if ($detailsData) {
|
||||
// دمج مصفوفة الرحلة (من سيرفر الرحلات) مع مصفوفة التفاصيل (من الرئيسي)
|
||||
$finalData = array_merge($rideData, $detailsData);
|
||||
} else {
|
||||
// في حال كانت الرحلة بدون سائق بعد، نكتفي ببيانات الرحلة
|
||||
$finalData = $rideData;
|
||||
}
|
||||
|
||||
// =================================================================
|
||||
// 4. فك التشفير (Decrypt)
|
||||
// =================================================================
|
||||
|
||||
if ($finalData) {
|
||||
$fieldsToDecrypt = ['driverName', 'gender', 'phone', 'car_plate', 'passengerName', 'last_name', 'token'];
|
||||
|
||||
foreach ($fieldsToDecrypt as $field) {
|
||||
if (!empty($finalData[$field])) {
|
||||
$finalData[$field] = $encryptionHelper->decryptData($finalData[$field]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
"status" => "success",
|
||||
"data" => $finalData
|
||||
]);
|
||||
|
||||
} catch (Exception $e) {
|
||||
error_log("API Error: " . $e->getMessage());
|
||||
http_response_code(500);
|
||||
echo json_encode(["status" => "failure", "message" => "Server Error: " . $e->getMessage()]);
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user