enforce(RateLimiter::identifier(), 'api'); try { $transit_con = Database::get('transit'); } catch (Exception $e) { jsonError('Transit service unavailable', 503); } // استخرج التوكن من الهيدر $authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? ''; $token = ''; if (preg_match('/Bearer\s+(\S+)/i', $authHeader, $m)) { $token = $m[1]; } else { $token = filterRequest('token') ?? ''; } if (!$token) jsonError('No session token provided', 400); $hash = hash('sha256', $token); // حذف من Redis — بلا بادئة siro: يدوية (العميل يضيفها تلقائياً عبر OPT_PREFIX) // كتابة "siro:transit:..." هنا كانت تنتج siro:siro:... فلا تُحذف الجلسة فعلياً if ($redis) $redis->del("transit:session:{$hash}"); // حذف من MySQL try { $transit_con->prepare("DELETE FROM transit_sessions WHERE token_hash=?")->execute([$hash]); } catch (Throwable $e) { // لا بأس — الجلسة انتهت بالـ Redis } jsonSuccess(null, 'Logged out successfully');