Update: 2026-07-14 00:34:22

This commit is contained in:
Hamza-Ayed
2026-07-14 00:34:22 +03:00
parent c956f27230
commit a547b81b60
14 changed files with 123 additions and 81 deletions
+48
View File
@@ -252,6 +252,54 @@ function transitDropEnrollment(int $orgId, string $passengerId): void
$redisLocation->sRem("transit:org_members:{$orgId}", $passengerId);
}
// ── كاش السائق في Redis ($redis الرئيسي — بادئة siro:) ──────────
// جدول transit_drivers صغير، لكن endpoints الرحلات تستعلم عنه بكثرة
// (today, start, end, delay, board_passenger, stop_passengers) — خصوصاً
// board_passenger أثناء مسح تذاكر الصعود. نمط read-through: نقرأ من Redis
// أولاً، وإن لم يوجد نستعلم القاعدة ونخزّن. المفتاح بـ main_driver_id
// (المعرّف الآتي من JWT). نبطل الكاش عند أي تغيير حالة (تفعيل/تعليق).
//
// نخزّن فقط السائقين النشطين (status='active'). أي سجل غير نشط لا يُكاش
// حتى لا نحتاج إبطالاً عند التفعيل — أول استعلام بعد التفعيل يبني الكاش.
function transitResolveDriver(string $mainDriverId): ?array
{
global $redis, $transit_con;
if (!$mainDriverId) return null;
$key = "transit:driver:{$mainDriverId}";
if ($redis) {
$cached = $redis->hGetAll($key);
if (!empty($cached) && isset($cached['id'])) {
return ['id' => (int)$cached['id'], 'org_id' => (int)$cached['org_id']];
}
}
if (!$transit_con) $transit_con = Database::get('transit');
$st = $transit_con->prepare(
"SELECT id, org_id FROM transit_drivers WHERE main_driver_id=? AND status='active' LIMIT 1"
);
$st->execute([$mainDriverId]);
$driver = $st->fetch();
if (!$driver) return null;
$resolved = ['id' => (int)$driver['id'], 'org_id' => (int)$driver['org_id']];
if ($redis) {
$redis->hMSet($key, $resolved);
$redis->expire($key, 3600); // ساعة — طبقة حماية إن فات إبطالٌ ما
}
return $resolved;
}
function transitInvalidateDriverCache(string $mainDriverId): void
{
global $redis;
if ($redis && $mainDriverId) $redis->del("transit:driver:{$mainDriverId}");
}
// ── days_mask helpers ────────────────────────────────────────
// bit0=Sun … bit6=Sat | 62 = 0b0111110 = الأحد–الخميس