Files
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

83 lines
2.7 KiB
PHP
Executable File

<?php
// find_drivers_redis.php
require_once __DIR__ . '/vendor/autoload.php';
use Predis\Client;
header('Content-Type: application/json');
$PASS_REDIS = trim(file_get_contents('/home/location/.reds_pass_key'));
// 1. استقبال البيانات (من تطبيق الراكب أو السيرفر الرئيسي)
// نفترض أنها تأتي POST أو GET
$lat = $_REQUEST['lat'] ?? null;
$lng = $_REQUEST['lng'] ?? null;
$radius = $_REQUEST['radius'] ?? 5; // القطر بالكيلومتر
$limit = $_REQUEST['limit'] ?? 50; // عدد السائقين
if (!$lat || !$lng) {
echo json_encode(['status' => false, 'message' => 'Missing coordinates']);
exit;
}
// 2. الاتصال بالريدز
try {
$redis = new Client([
'scheme' => 'tcp',
'host' => '127.0.0.1','password' => $PASS_REDIS,
'port' => 6379,
]);
$redis->connect();
} catch (Exception $e) {
echo json_encode(['status' => false, 'message' => 'Redis Error']);
exit;
}
// 3. البحث الجغرافي (السحر هنا) 🎩
// يبحث عن السائقين المتاحين (available) فقط
// التعديل: تفعيل WITHDIST و SORT كـ مفاتيح
$driversGeo = $redis->georadius(
'geo:drivers:available',
$lng,
$lat,
$radius,
'km',
['WITHDIST' => true,'WITHCOORD' => true, 'COUNT' => $limit, 'SORT' => 'ASC']
);
// النتيجة تكون مصفوفة: [ [driver_id, distance], ... ]
$resultDrivers = [];
// 4. جلب التفاصيل
if (!empty($driversGeo)) {
foreach ($driversGeo as $item) {
$driverId = $item[0];
$distance = $item[1]; // المسافة بالكيلومتر
$d_coord= $item[2]; // [0=>lng, 1=>lat] 🔥 الإحداثيات هنا
// جلب البيانات الوصفية من الرام (Profile)
// هذه البيانات خزنها السوكيت قبل قليل
$profile = $redis->hgetall("driver:profile:$driverId");
// دمج البيانات
$resultDrivers[] = [
'driver_id' => $driverId,
'distance_km' => $distance,
'heading' => $profile['heading'] ?? 0,
'speed' => $profile['speed'] ?? 0,
'status' => $profile['status'] ?? 'off',
'lat' => $d_coord[1], // Latitude من الريدز (أدق)
'lng' => $d_coord[0] // Longitude
// يمكنك هنا إضافة استعلام MySQL بسيط لجلب اسم السائق وصورته إذا لم تكن مخزنة في الريدز
// لكن للسرعة، سنكتفي بهذا الآن
];
}
}
// 5. إرجاع النتيجة
echo json_encode([
'status' => true,
'count' => count($resultDrivers),
'drivers' => $resultDrivers
]);
?>