__DIR__ . '/../core/', 'App\\' => __DIR__ . '/../app/', ]; foreach ($prefixes as $prefix => $baseDir) { $len = strlen($prefix); if (strncmp($prefix, $class, $len) !== 0) { continue; } $relativeClass = substr($class, $len); $file = $baseDir . str_replace('\\', '/', $relativeClass) . '.php'; if (file_exists($file)) { require_once $file; return; } } }); } // 2. Load Environment Variables if Dotenv exists or read .env manually $envFile = __DIR__ . '/../.env'; if (file_exists($envFile)) { $lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach ($lines as $line) { if (str_starts_with(trim($line), '#') || !str_contains($line, '=')) { continue; } [$name, $val] = explode('=', $line, 2); $name = trim($name); $val = trim($val, " \t\n\r\0\x0B\"'"); if (!getenv($name)) { putenv("$name=$val"); $_ENV[$name] = $val; } } } use Core\Request; use Core\Response; use Core\Router; use App\Middlewares\SecurityHeaderMiddleware; use App\Middlewares\AuthMiddleware; use App\Middlewares\AdminMiddleware; use App\Controllers\AuthController; use App\Controllers\SubscriptionController; use App\Controllers\QrController; use App\Controllers\PartnerController; use App\Controllers\PaymentController; use App\Controllers\AdminController; use App\Controllers\GatewayController; $request = new Request(); $router = new Router(); // ============================================================================== // PUBLIC ROUTES (No Strict Fingerprint Header Required for Initial Onboarding) // ============================================================================== $router->get('/api/v1/health', function (Request $req) { Response::success([ 'service' => 'Uruk International Prize Core Engine', 'version' => '1.0.0', 'server_time' => date('Y-m-d H:i:s'), 'status' => 'operational', ]); }); // Authentication routes $router->post('/api/v1/auth/request-otp', [AuthController::class, 'requestOtp']); $router->post('/api/v1/auth/verify-otp', [AuthController::class, 'verifyOtp']); // Public directory of hospitals & hotels $router->get('/api/v1/partners', [PartnerController::class, 'listPartners']); $router->get('/api/v1/partners/{id}', [PartnerController::class, 'getPartner']); // Public membership plan details $router->get('/api/v1/subscription/plans', [SubscriptionController::class, 'getPlans']); // Reception QR verification scanner (used by hospitals/hotels) $router->post('/api/v1/qr/verify-token', [QrController::class, 'verifyToken']); // Automated Payment Listeners & Webhooks $router->post('/api/v1/payments/ingest-notification', [PaymentController::class, 'ingestNotification']); $router->post('/api/v1/payments/swiftpay-webhook', [PaymentController::class, 'swiftPayWebhook']); // ============================================================================== // GATEWAY CALLER & SMS CLUSTER (Zain, Asiacell, Korek 3-Device Gateway Nodes) // ============================================================================== $router->get('/api/v1/gateway/pending-call', [GatewayController::class, 'pendingCall']); $router->get('/pending-call.php', [GatewayController::class, 'pendingCall']); $router->get('/api/v1/gateway/pending-sms', [GatewayController::class, 'pendingSms']); $router->get('/pending-sms.php', [GatewayController::class, 'pendingSms']); $router->post('/api/v1/gateway/call-done', [GatewayController::class, 'callDone']); $router->post('/call-done.php', [GatewayController::class, 'callDone']); $router->post('/api/v1/gateway/sms-done', [GatewayController::class, 'smsDone']); $router->post('/sms-done.php', [GatewayController::class, 'smsDone']); $router->post('/api/v1/gateway/register-device', [GatewayController::class, 'registerDevice']); $router->post('/register-device.php', [GatewayController::class, 'registerDevice']); // ============================================================================== // SECURE USER ROUTES (Requires X-User-Id, X-Device-Fingerprint, Signature & Auth) // ============================================================================== $userMiddlewares = [SecurityHeaderMiddleware::class, AuthMiddleware::class]; $router->get('/api/v1/auth/profile', [AuthController::class, 'getProfile'], $userMiddlewares); $router->get('/api/v1/subscription/my-card', [SubscriptionController::class, 'getMyCard'], $userMiddlewares); $router->post('/api/v1/subscription/submit', [SubscriptionController::class, 'submitSubscription'], $userMiddlewares); $router->get('/api/v1/qr/dynamic-token', [QrController::class, 'getDynamicToken'], $userMiddlewares); // ============================================================================== // HIDDEN IN-APP ADMIN ROUTES (Dr. Thamer & Management) // ============================================================================== $adminMiddlewares = [SecurityHeaderMiddleware::class, AuthMiddleware::class, AdminMiddleware::class]; $router->post('/api/v1/admin/partners/add', [AdminController::class, 'addPartner'], $adminMiddlewares); $router->get('/api/v1/admin/payments/pending', [AdminController::class, 'listPendingPayments'], $adminMiddlewares); $router->post('/api/v1/admin/payments/approve', [AdminController::class, 'approvePayment'], $adminMiddlewares); $router->get('/api/v1/admin/stats', [AdminController::class, 'getStats'], $adminMiddlewares); // Dispatch incoming request $router->dispatch($request);