Files
tripz-llc/backend/ride/rides/public_track_location.php
T
Hamza-AyedandClaude Opus 5 4d8414c96b feat: استيراد كود سيرو إلى تريبز (سيرو @ecfe7568) — بلا تعديل
قرار المالك 2026-07-27: باك إند سيرو PHP هو المعتمد، وتطبيقاته المجرّبة
ميدانياً تحل محل إعادة البناء المؤرشفة. سيرو نفسه لم يُمسّ.

الخريطة:
  backend · payment_server · loction_server · ride_server ·
  passenger_server · docker · dashboard · stress_test  → الجذر
  siro_rider  → apps/rider          siro_driver  → apps/driver
  siro_admin  → dashboards/admin    siro_service → dashboards/service
  android_bot → apps/android_bot    socialBot    → apps/socialBot

نُسخ المتعقَّب في git سيرو فقط عبر `git archive` (3,198 ملفاً / ~169 م.ب)
لا `cp -r` — فاستُثنيت مخلفات البناء تلقائياً. بلا أي تعديل محتوى عمداً:
كل ما يلي يصير فرقاً مقروءاً مقابل المصدر.

لم يُستورد وسببه: siromove.com (الموقع التسويقي يبقى marketing/ في تريبز،
سيرو فيه 8 ملفات) · docs و planning (تريبز له docs/ الخاص) · deploy.sh
(ليس نشراً على سيرفر بل `git add . && git push origin --all` — فخّ في
مستودع آخر) · transit_dashboard (بانتظار قرار مصير backend-transit و
dashboards/transit-web).

⚠️ لا يبني بعد — ثلاثة نواقص متوقعة ومقصودة:
1. `.env` و `lib/env/env.g.dart` غير متعقَّبين في سيرو (أسرار لكل مستأجر):
   كل تطبيق فلاتر يحتاج .env خاصاً ثم توليد env.g.dart بـ build_runner.
2. إعدادات Firebase (9 ملفات google-services.json و GoogleService-Info.plist)
   يستبعدها .gitignore تريبز — ولكل مستأجر مشروع Firebase خاص أصلاً.
3. apps/driver في سيرو يشير إلى `../../Intaleq/packages/get` خارج المستودع →
   يجب ضمّ الحزم داخله أسوة بـ apps/rider.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-27 05:14:13 +03:00

100 lines
3.5 KiB
PHP

<?php
// ابدأ التخزين المؤقت فوراً
ob_start();
require_once __DIR__ . '/../../get_connect.php';
// تنظيف *جميع* مستويات التخزين المؤقت (Loop)
// هذا يضمن التخلص من أي مسافات أو أخطاء ظهرت من ملفات الـ include
while (ob_get_level()) {
ob_end_clean();
}
// ابدأ مخزناً جديداً ونظيفاً لهذا الملف فقط
ob_start();
header("Content-Type: application/json; charset=UTF-8");
function sendError($message, $code = 400, $extra = []) {
// تنظيف ما قبل الخطأ
ob_clean();
http_response_code($code);
echo json_encode(array_merge(["status" => "failure", "message" => $message], $extra));
exit;
}
try {
$rideID = filter_input(INPUT_GET, 'id', FILTER_SANITIZE_NUMBER_INT);
$token = filter_input(INPUT_GET, 'token', FILTER_SANITIZE_SPECIAL_CHARS);
if (!$rideID || !$token) {
sendError("Missing parameters");
}
$stmtRide = $con_ride->prepare("SELECT driver_id, status FROM ride WHERE id = ? LIMIT 1");
$stmtRide->execute([$rideID]);
$rideData = $stmtRide->fetch(PDO::FETCH_ASSOC);
if (!$rideData) sendError("Ride not found");
$driverID = $rideData['driver_id'];
$status = $rideData['status'];
// ✅ FIX H-03: استبدال md5 بـ hash_hmac
$secretSalt = getenv('TRACKING_SECRET_SALT') ;
$generatedToken = hash_hmac('sha256', $rideID . $driverID, $secretSalt);
if ($token !== $generatedToken) sendError("Invalid Token");
$allowedStatuses = ['Applied', 'Arrived', 'Begin', 'inProgress'];
if (!in_array($status, $allowedStatuses)) {
sendError("Ride not active", 200, ["current_status" => $status]);
}
$stmtLoc = $con_tracking->prepare("SELECT latitude, longitude, heading, speed, updated_at FROM car_locations WHERE driver_id = ? ORDER BY updated_at DESC LIMIT 1");
$stmtLoc->execute([$driverID]);
$locData = $stmtLoc->fetch(PDO::FETCH_ASSOC);
if (!$locData) sendError("Waiting for driver signal...", 200);
$stmtDriver = $con->prepare("SELECT d.first_name, c.model, c.color, c.car_plate FROM driver d LEFT JOIN CarRegistration c ON d.id = c.driverID WHERE d.id = ? LIMIT 1");
$stmtDriver->execute([$driverID]);
$driverInfo = $stmtDriver->fetch(PDO::FETCH_ASSOC);
$driverName = "Captain";
$carModel = "Car";
$carColor = "";
$plate = "";
if ($driverInfo) {
if (!empty($driverInfo['first_name'])) $driverName = $encryptionHelper->decryptData($driverInfo['first_name']);
if (!empty($driverInfo['model'])) $carModel = $driverInfo['model'];
if (!empty($driverInfo['color'])) $carColor = $driverInfo['color'];
if (!empty($driverInfo['car_plate'])) $plate = $encryptionHelper->decryptData($driverInfo['car_plate']);
}
$response = [
"status" => "success",
"data" => [
"lat" => $locData['latitude'],
"lng" => $locData['longitude'],
"heading" => $locData['heading'],
"speed" => $locData['speed'],
"last_update" => $locData['updated_at'],
"driver_name" => $driverName,
"car_model" => $carModel,
"car_color" => $carColor,
"plate" => $plate,
"ride_status" => $status
]
];
// التنظيف النهائي قبل الطباعة
ob_clean();
echo json_encode($response);
} catch (Exception $e) {
error_log("Tracking API Error: " . $e->getMessage());
sendError("Server Error");
}