Files
urukprize/backend/public/index.php
T

141 lines
5.9 KiB
PHP

<?php
declare(strict_types=1);
// Set default timezone
date_default_timezone_set('Asia/Baghdad');
// 1. PSR-4 Autoloader Implementation with Composer fallback
if (file_exists(__DIR__ . '/../vendor/autoload.php')) {
require_once __DIR__ . '/../vendor/autoload.php';
} else {
spl_autoload_register(function (string $class) {
$prefixes = [
'Core\\' => __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);