Files
saqel/backend/public/index.php
T

174 lines
12 KiB
PHP

<?php
/**
* Saqel API Front Controller
* Single entry point handling routing and application bootstrap.
*/
// 1. Boot the application (autoloader, env, errors)
require_once dirname(__DIR__) . '/app/bootstrap.php';
use App\Core\Request;
use App\Core\Response;
use App\Core\Router;
// 2. Initialize request and response objects
$request = new Request();
$response = new Response();
$router = new Router();
// 3. Define Global Middleware
$router->use(\App\Middlewares\SecurityMiddleware::class);
// 4. Define Web and API Routes
// Main Platform Landing Page (Public High-Conversion Showcase)
$router->get('/', function ($request, $response) {
$response->html(\App\Views\LandingPage::render());
});
// Dedicated Institutional Proposal for Military Culture Directorate
$router->get('/military-culture', function ($request, $response) {
$response->html(\App\Views\MilitaryCulturePitch::render());
});
$router->get('/military', function ($request, $response) {
$response->html(\App\Views\MilitaryCulturePitch::render());
});
// Web Portals (HTML + Native JavaScript)
$router->get('/student', function ($request, $response) {
$response->html(\App\Views\StudentPortal::render());
});
$router->get('/teacher', function ($request, $response) {
$response->html(\App\Views\TeacherPortal::render());
});
$router->get('/guardian', function ($request, $response) {
$response->html(\App\Views\GuardianPortal::render());
});
$router->get('/school-admin', function ($request, $response) {
$response->html(\App\Views\SchoolAdminPortal::render());
});
$router->get('/curriculum-studio', function ($request, $response) {
$response->html(\App\Views\CurriculumStudio::render());
});
// Real Ministry Curriculum PDF Ingestion & Live Tree API
$router->post('/api/curriculum/upload-pdf', [\App\Controllers\CurriculumController::class, 'uploadPdf']);
$router->get('/api/curriculum/upload-status', [\App\Controllers\CurriculumController::class, 'getUploadStatus']);
$router->get('/api/curriculum/upload-log', [\App\Controllers\CurriculumController::class, 'getUploadLog']);
$router->get('/api/curriculum/tree', [\App\Controllers\CurriculumController::class, 'getTree']);
$router->get('/api/curriculum/lesson', [\App\Controllers\CurriculumController::class, 'getLessonContent']);
$router->post('/api/curriculum/save-lesson', [\App\Controllers\CurriculumController::class, 'saveLessonContent']);
$router->post('/api/curriculum/generate-ai-assets', [\App\Controllers\CurriculumController::class, 'generateAiAssets']);
$router->post('/api/curriculum/bake-lab', [\App\Controllers\CurriculumController::class, 'bakeInteractiveLab']);
$router->post('/api/curriculum/generate-questions', [\App\Controllers\CurriculumController::class, 'generateQuestionBank']);
$router->post('/api/curriculum/upload-video', [\App\Controllers\CurriculumController::class, 'uploadLessonVideo']);
$router->get('/api/curriculum/search', function ($request, $response) {
$q = $request->getQueryParams()['q'] ?? '';
$response->json([
'status' => 'success',
'data' => \App\Services\CurriculumService::searchCurriculum($q)
]);
});
$router->get('/api/curriculum/simulations', [\App\Controllers\CurriculumController::class, 'listSimulations']);
$router->get('/api/curriculum/simulations/{subject}/{simName}', [\App\Controllers\CurriculumController::class, 'getSimulation']);
$router->get('/api/curriculum/document', [\App\Controllers\CurriculumController::class, 'getDocumentContent']);
// Health & Diagnostic Routes
$router->get('/api/health', function ($request, $response) {
$response->json([
'status' => 'success',
'message' => 'Saqel API is healthy and fast (Pure PHP)',
'app_name' => getenv('APP_NAME') ?: 'Saqel',
'time' => date('Y-m-d H:i:s')
]);
});
$router->get('/api/test/nabeh', [\App\Controllers\TestController::class, 'testNabeh']);
$router->get('/api/test/system', [\App\Controllers\TestController::class, 'testSystem']);
// OTP Authentication Routes (WhatsApp via Nabeh Gateway + Device Fingerprinting)
$router->post('/api/auth/otp/request', [\App\Controllers\AuthController::class, 'requestOtp'], [\App\Middlewares\RateLimitMiddleware::class]);
$router->post('/api/auth/otp/verify', [\App\Controllers\AuthController::class, 'verifyOtp'], [\App\Middlewares\RateLimitMiddleware::class]);
$router->post('/api/auth/logout', [\App\Controllers\AuthController::class, 'logout'], [\App\Middlewares\AuthMiddleware::class]);
$router->get('/api/auth/me', [\App\Controllers\AuthController::class, 'me'], [\App\Middlewares\AuthMiddleware::class]);
$router->post('/api/auth/student/login-national-id', [\App\Controllers\AuthController::class, 'verifyNationalId'], [\App\Middlewares\RateLimitMiddleware::class]);
$router->get('/api/student/profile/status', [\App\Controllers\AuthController::class, 'studentProfileStatus'], [\App\Middlewares\AuthMiddleware::class]);
$router->post('/api/student/profile/setup', [\App\Controllers\AuthController::class, 'studentProfileSetup'], [\App\Middlewares\RateLimitMiddleware::class]);
// Guardian Routes (Authenticated)
$router->get('/api/guardian/dashboard', [\App\Controllers\GuardianController::class, 'getDashboard'], [\App\Middlewares\AuthMiddleware::class]);
// Legacy / Direct Auth
$router->post('/api/auth/register', [\App\Controllers\AuthController::class, 'register'], [\App\Middlewares\RateLimitMiddleware::class]);
$router->post('/api/auth/login', [\App\Controllers\AuthController::class, 'login'], [\App\Middlewares\RateLimitMiddleware::class]);
// Teacher Studio Routes (Authenticated)
$router->get('/api/teacher/profile/status', [\App\Controllers\TeacherController::class, 'profileStatus'], [\App\Middlewares\AuthMiddleware::class]);
$router->post('/api/teacher/profile/setup', [\App\Controllers\TeacherController::class, 'setupProfile'], [\App\Middlewares\AuthMiddleware::class]);
$router->get('/api/teacher/dashboard', [\App\Controllers\TeacherController::class, 'getDashboard'], [\App\Middlewares\AuthMiddleware::class]);
$router->get('/api/teacher/courses', [\App\Controllers\TeacherController::class, 'getCourses'], [\App\Middlewares\AuthMiddleware::class]);
$router->post('/api/teacher/courses', [\App\Controllers\TeacherController::class, 'addCourse'], [\App\Middlewares\AuthMiddleware::class]);
$router->post('/api/teacher/lessons', [\App\Controllers\TeacherController::class, 'addLesson'], [\App\Middlewares\AuthMiddleware::class]);
// Dual Video Storage & Cloudflare R2 / HLS Stream Routes (API-Driven)
$router->post('/api/teacher/videos/upload-direct', [\App\Controllers\VideoController::class, 'uploadDirect'], [\App\Middlewares\AuthMiddleware::class]);
$router->post('/api/teacher/lessons/checkpoints', [\App\Controllers\VideoController::class, 'saveCheckpoint'], [\App\Middlewares\AuthMiddleware::class]);
$router->get('/api/student/lessons', [\App\Controllers\VideoController::class, 'getStudentLessons']);
$router->get('/api/videos/stream/{uuid}', [\App\Controllers\VideoController::class, 'streamLocalVideo']);
$router->get('/api/videos/hls/{uuid}/{file}', [\App\Controllers\VideoController::class, 'streamHls']);
$router->get('/api/lessons/playback', [\App\Controllers\VideoController::class, 'getPlaybackData']);
$router->get('/api/lessons/{id}/playback', [\App\Controllers\VideoController::class, 'getPlaybackData']);
// Student & Teacher Chat Routes (API-Driven, Authenticated)
$router->get('/api/chat/conversations', [\App\Controllers\ChatController::class, 'getConversations'], [\App\Middlewares\AuthMiddleware::class]);
$router->get('/api/chat/messages', [\App\Controllers\ChatController::class, 'getMessages'], [\App\Middlewares\AuthMiddleware::class]);
$router->post('/api/chat/messages', [\App\Controllers\ChatController::class, 'sendMessage'], [\App\Middlewares\AuthMiddleware::class]);
$router->post('/api/chat/read', [\App\Controllers\ChatController::class, 'markAsRead'], [\App\Middlewares\AuthMiddleware::class]);
$router->get('/api/chat/unread-count', [\App\Controllers\ChatController::class, 'getUnreadCount'], [\App\Middlewares\AuthMiddleware::class]);
// Multi-Level Exams & AI Mastery Analytics Routes (API-Driven)
$router->get('/api/exams', [\App\Controllers\ExamController::class, 'getExams'], [\App\Middlewares\AuthMiddleware::class]);
$router->get('/api/exams/{id}', [\App\Controllers\ExamController::class, 'getExamDetails'], [\App\Middlewares\AuthMiddleware::class]);
$router->post('/api/exams/{id}/submit', [\App\Controllers\ExamController::class, 'submitExam'], [\App\Middlewares\AuthMiddleware::class]);
$router->get('/api/student/progress/mastery', [\App\Controllers\ExamController::class, 'getMastery'], [\App\Middlewares\AuthMiddleware::class]);
$router->post('/api/student/lessons/{id}/progress', [\App\Controllers\VideoController::class, 'saveProgress'], [\App\Middlewares\AuthMiddleware::class]);
// Smart Error Notebook & Adaptive Remediation Routes (دفتر الأخطاء الذكي والمسارات العلاجية)
$router->get('/api/student/error-notebook', [\App\Controllers\ErrorNotebookController::class, 'getErrorNotebook']);
$router->post('/api/student/error-notebook/log', [\App\Controllers\ErrorNotebookController::class, 'logError']);
$router->get('/api/student/error-notebook/remediation-quiz', [\App\Controllers\ErrorNotebookController::class, 'getRemediationQuiz']);
$router->post('/api/student/error-notebook/resolve', [\App\Controllers\ErrorNotebookController::class, 'resolveError']);
// Multi-Teacher Marketplace & Fair Reputation Routes (AI Telemetry + Anti-Brigade Defense)
$router->get('/api/teachers', [\App\Controllers\TeacherController::class, 'getMarketplaceTeachers']);
$router->get('/api/teachers/{id}/metrics', [\App\Controllers\TeacherController::class, 'getTeacherMetrics']);
$router->post('/api/teachers/{id}/reviews', [\App\Controllers\TeacherController::class, 'submitReview'], [\App\Middlewares\AuthMiddleware::class]);
$router->get('/api/teacher/reputation', [\App\Controllers\TeacherController::class, 'getMyReputation'], [\App\Middlewares\AuthMiddleware::class]);
$router->get('/api/teacher/monetization', [\App\Controllers\TeacherController::class, 'getMonetizationDashboard']);
$router->post('/api/teacher/audit-studio-video', [\App\Controllers\TeacherController::class, 'auditStudioVideo']);
$router->get('/api/curriculum/interactive-lab', [\App\Controllers\CurriculumController::class, 'getInteractiveLab']);
// Military Culture Directorate & School Principal/Supervisor Routes (Institutional Architecture)
$router->get('/api/directorate/dashboard', [\App\Controllers\DirectorateSupervisorController::class, 'getDirectorateDashboard']);
$router->get('/api/supervisor/school-dashboard', [\App\Controllers\DirectorateSupervisorController::class, 'getSchoolDashboard']);
$router->post('/api/supervisor/record-lesson', [\App\Controllers\DirectorateSupervisorController::class, 'recordLesson']);
$router->post('/api/supervisor/exam/push-to-lab', [\App\Controllers\DirectorateSupervisorController::class, 'pushExamToLab']);
$router->post('/api/supervisor/exam/upload-panoramic', [\App\Controllers\DirectorateSupervisorController::class, 'uploadPanoramicSample']);
// Dual-Form Unified Exams & Statistical Anti-Cheating
$router->get('/api/unified-exams/dual-forms', [\App\Controllers\DirectorateSupervisorController::class, 'generateDualForms']);
$router->post('/api/unified-exams/evaluate-integrity', [\App\Controllers\DirectorateSupervisorController::class, 'evaluateExamSessionIntegrity']);
// Automated Parent Reporting via WhatsApp / Nabeh Gateway
$router->post('/api/parent-reports/dispatch', [\App\Controllers\DirectorateSupervisorController::class, 'dispatchParentReports']);
// School Roster Import & Encrypted National ID Engine (AES-256-GCM)
$router->post('/api/school-roster/import', [\App\Controllers\DirectorateSupervisorController::class, 'importSchoolRoster']);
// 5. Dispatch the request
$router->dispatch($request, $response);