Initial commit: Uruk Prize Platform architecture, backend core, mobile app, gateway caller & deployment pipeline
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine On
|
||||
RewriteCond %{REQUEST_FILENAME} !-f
|
||||
RewriteCond %{REQUEST_FILENAME} !-d
|
||||
RewriteRule ^(.*)$ index.php [QSA,L]
|
||||
</IfModule>
|
||||
@@ -0,0 +1,140 @@
|
||||
<?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);
|
||||
Reference in New Issue
Block a user