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>
This commit is contained in:
co-authored by
Claude Opus 5
parent
9909d9b4c1
commit
4d8414c96b
@@ -0,0 +1,167 @@
|
||||
<?php
|
||||
require_once __DIR__ . '/../../connect.php';
|
||||
|
||||
if ($role !== 'admin' && $role !== 'super_admin') {
|
||||
http_response_code(403);
|
||||
echo json_encode(['error' => 'Unauthorized: Admin access required']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// التطبيع عبر normalizePhone() الموحّدة في core/helpers.php (نفس المنطق سابقاً)
|
||||
|
||||
$phone = filterRequest('phone');
|
||||
if (!$phone) {
|
||||
error_log("[get_last_ride] Missing phone parameter");
|
||||
jsonError("Phone is required");
|
||||
exit;
|
||||
}
|
||||
|
||||
// تطبيع الرقم أولاً
|
||||
$raw = normalizePhone($phone);
|
||||
|
||||
// شَفِّر قبل الاستعلام
|
||||
$enc_raw = $encryptionHelper->encryptData($raw);
|
||||
|
||||
try {
|
||||
error_log("[get_last_ride] Searching phone normalized=$raw");
|
||||
|
||||
// 1) ابحث عن الراكب بالهاتف المشفّر
|
||||
$selP = $con->prepare("
|
||||
SELECT id, first_name, last_name, phone
|
||||
FROM passengers
|
||||
WHERE phone = :enc_raw OR (:bidx IS NOT NULL AND phone_bidx = :bidx)
|
||||
LIMIT 1
|
||||
");
|
||||
$selP->execute(['enc_raw' => $enc_raw, 'bidx' => $pBidx]);
|
||||
$passenger = $selP->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
// 2) ابحث عن السائق بالهاتف المشفّر
|
||||
$selD = $con->prepare("
|
||||
SELECT id AS driverID, first_name, last_name, phone
|
||||
FROM driver
|
||||
WHERE phone = :enc_raw OR (:bidx IS NOT NULL AND phone_bidx = :bidx)
|
||||
LIMIT 1
|
||||
");
|
||||
$selD->execute(['enc_raw' => $enc_raw, 'bidx' => $dBidx]);
|
||||
$driver = $selD->fetch(PDO::FETCH_ASSOC);
|
||||
|
||||
$userId = null;
|
||||
$userType = null;
|
||||
|
||||
if ($passenger) {
|
||||
$userId = $passenger['id'];
|
||||
$userType = 'passenger';
|
||||
error_log("[get_last_ride] Passenger found id=" . $userId);
|
||||
}
|
||||
if ($driver) {
|
||||
$userId = $driver['driverID'];
|
||||
$userType = 'driver';
|
||||
error_log("[get_last_ride] Driver found id=" . $userId);
|
||||
}
|
||||
|
||||
if (!$userId) {
|
||||
error_log("[get_last_ride] User not found (phone=$raw)");
|
||||
jsonError('Phone number not found in system');
|
||||
exit;
|
||||
}
|
||||
|
||||
// 3) تحديد حقل البحث في الرحلة
|
||||
$userField = ($userType === 'driver') ? 'r.driver_id' : 'r.passenger_id';
|
||||
|
||||
// فلترة حسب الحالة إذا أُرسلت
|
||||
$filterStatus = filterRequest('status');
|
||||
$whereExtra = '';
|
||||
$params = [':uid' => $userId];
|
||||
|
||||
if (!empty($filterStatus) && $filterStatus !== 'all') {
|
||||
$whereExtra = "AND r.status = :filter_status";
|
||||
$params[':filter_status'] = $filterStatus;
|
||||
}
|
||||
|
||||
// 4) آخر 20 رحلة لهذا المستخدم
|
||||
$rideStmt = $con->prepare("
|
||||
SELECT
|
||||
r.id,
|
||||
r.start_location,
|
||||
r.end_location,
|
||||
r.date,
|
||||
r.time,
|
||||
r.endtime,
|
||||
r.status,
|
||||
r.paymentMethod,
|
||||
r.carType,
|
||||
r.price,
|
||||
r.price_for_driver,
|
||||
r.price_for_passenger,
|
||||
r.distance,
|
||||
r.driver_id,
|
||||
r.passenger_id,
|
||||
r.created_at,
|
||||
r.updated_at,
|
||||
r.DriverIsGoingToPassenger,
|
||||
r.rideTimeStart,
|
||||
r.rideTimeFinish,
|
||||
d.first_name AS driver_first_name,
|
||||
d.last_name AS driver_last_name,
|
||||
d.phone AS d_phone,
|
||||
p.first_name AS p_fname,
|
||||
p.last_name AS p_lname,
|
||||
p.phone AS p_phone
|
||||
FROM ride r
|
||||
LEFT JOIN driver d ON d.id = r.driver_id
|
||||
LEFT JOIN passengers p ON p.id = r.passenger_id
|
||||
WHERE $userField = :uid $whereExtra
|
||||
ORDER BY r.created_at DESC, r.id DESC
|
||||
LIMIT 20
|
||||
");
|
||||
$rideStmt->execute($params);
|
||||
$rides = $rideStmt->fetchAll(PDO::FETCH_ASSOC);
|
||||
|
||||
// 5) فك تشفير الأسماء
|
||||
if ($passenger) {
|
||||
$passenger['first_name'] = $encryptionHelper->decryptData($passenger['first_name']);
|
||||
$passenger['last_name'] = $encryptionHelper->decryptData($passenger['last_name']);
|
||||
$passenger['phone'] = $encryptionHelper->decryptData($passenger['phone']);
|
||||
}
|
||||
if ($driver) {
|
||||
$driver['first_name'] = $encryptionHelper->decryptData($driver['first_name']);
|
||||
$driver['last_name'] = $encryptionHelper->decryptData($driver['last_name']);
|
||||
$driver['phone'] = $encryptionHelper->decryptData($driver['phone']);
|
||||
}
|
||||
|
||||
foreach ($rides as &$ride) {
|
||||
if (!empty($ride['driver_first_name'])) {
|
||||
$ride['driver_first_name'] = $encryptionHelper->decryptData($ride['driver_first_name']);
|
||||
}
|
||||
if (!empty($ride['driver_last_name'])) {
|
||||
$ride['driver_last_name'] = $encryptionHelper->decryptData($ride['driver_last_name']);
|
||||
}
|
||||
if (!empty($ride['d_phone'])) {
|
||||
$ride['d_phone'] = $encryptionHelper->decryptData($ride['d_phone']);
|
||||
}
|
||||
if (!empty($ride['p_fname'])) {
|
||||
$ride['p_fname'] = $encryptionHelper->decryptData($ride['p_fname']);
|
||||
}
|
||||
if (!empty($ride['p_lname'])) {
|
||||
$ride['p_lname'] = $encryptionHelper->decryptData($ride['p_lname']);
|
||||
}
|
||||
if (!empty($ride['p_phone'])) {
|
||||
$ride['p_phone'] = $encryptionHelper->decryptData($ride['p_phone']);
|
||||
}
|
||||
}
|
||||
unset($ride);
|
||||
|
||||
// 6) الرد
|
||||
$response = [
|
||||
'user_type' => $userType,
|
||||
'user' => $userType === 'driver' ? $driver : $passenger,
|
||||
'rides' => $rides
|
||||
];
|
||||
|
||||
error_log("[get_last_ride] Success response for " . $userType . " id=" . $userId);
|
||||
jsonSuccess($response);
|
||||
|
||||
} catch (Throwable $e) {
|
||||
error_log("[get_last_ride] Exception: " . $e->getMessage());
|
||||
jsonError("An internal error occurred. Please try again later.");
|
||||
}
|
||||
Reference in New Issue
Block a user