130 lines
4.9 KiB
PHP
130 lines
4.9 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
|
|
use App\Core\Request;
|
|
use App\Core\Response;
|
|
use App\Services\CurriculumService;
|
|
use App\Services\CurriculumExtractorService;
|
|
|
|
class CurriculumController
|
|
{
|
|
/**
|
|
* Upload and Deep-Extract Real Ministry PDF Document
|
|
*/
|
|
public function uploadPdf(Request $request, Response $response): void
|
|
{
|
|
if (empty($_FILES['pdf_file']) || $_FILES['pdf_file']['error'] !== UPLOAD_ERR_OK) {
|
|
$response->status(400)->json([
|
|
'status' => 'error',
|
|
'message' => 'يرجى اختيار ملف PDF صالح للمنهاج الوزاري.'
|
|
]);
|
|
return;
|
|
}
|
|
|
|
$file = $_FILES['pdf_file'];
|
|
$origName = $file['name'];
|
|
$tmpPath = $file['tmp_name'];
|
|
|
|
// Save original uploaded PDF in storage/uploads/curriculum
|
|
$uploadsDir = __DIR__ . '/../../storage/uploads/curriculum';
|
|
if (!is_dir($uploadsDir)) {
|
|
mkdir($uploadsDir, 0777, true);
|
|
}
|
|
$savedPdfPath = $uploadsDir . '/' . time() . '_' . preg_replace('/[^A-Za-z0-9_\-\.]/u', '_', $origName);
|
|
move_uploaded_file($tmpPath, $savedPdfPath);
|
|
|
|
// Perform Deep Multi-Engine Extraction & Structuring
|
|
$parsedStructure = CurriculumExtractorService::extractAndStructure($origName, $savedPdfPath);
|
|
|
|
// Merge into live tree and save to disk
|
|
$updatedTree = CurriculumService::mergeExtractedCurriculum($parsedStructure);
|
|
|
|
$firstLessonFile = '';
|
|
$firstLessonMd = '';
|
|
$firstLessonTitle = '';
|
|
$firstLessonOutcomes = [];
|
|
$breadcrumb = '';
|
|
|
|
if (!empty($parsedStructure['units'][0]['lessons'][0])) {
|
|
$firstLes = $parsedStructure['units'][0]['lessons'][0];
|
|
$firstLessonFile = "{$parsedStructure['grade_key']}/{$parsedStructure['subject_key']}/{$parsedStructure['semester_key']}/{$parsedStructure['units'][0]['unit_key']}/{$firstLes['lesson_id']}.md";
|
|
$firstLessonMd = CurriculumService::getLessonMarkdown($firstLessonFile);
|
|
$firstLessonTitle = $firstLes['title'];
|
|
$firstLessonOutcomes = $firstLes['outcomes'] ?? [];
|
|
$breadcrumb = "{$parsedStructure['grade_name']} ⟵ {$parsedStructure['subject_name']} ⟵ {$parsedStructure['units'][0]['unit_name']}";
|
|
}
|
|
|
|
$serverStorageDir = realpath(__DIR__ . '/../../storage/curriculum');
|
|
|
|
$response->json([
|
|
'status' => 'success',
|
|
'message' => "تم تفريغ وفهرسة المنهاج [{$origName}] بنجاح في قاعدة المعرفة!",
|
|
'extracted_data' => $parsedStructure,
|
|
'tree' => $updatedTree,
|
|
'active_file' => $firstLessonFile,
|
|
'active_md' => $firstLessonMd,
|
|
'active_title' => $firstLessonTitle,
|
|
'active_outcomes' => $firstLessonOutcomes,
|
|
'active_breadcrumb' => $breadcrumb,
|
|
'server_storage_dir' => $serverStorageDir
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Get Complete Live Tree
|
|
*/
|
|
public function getTree(Request $request, Response $response): void
|
|
{
|
|
$response->json([
|
|
'status' => 'success',
|
|
'data' => CurriculumService::getCurriculumTree()
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Get Single Lesson Markdown Content
|
|
*/
|
|
public function getLessonContent(Request $request, Response $response): void
|
|
{
|
|
$file = $request->getQueryParams()['file'] ?? '';
|
|
if (empty($file)) {
|
|
$response->status(400)->json(['status' => 'error', 'message' => 'مسار الملف مطلوب']);
|
|
return;
|
|
}
|
|
$content = CurriculumService::getLessonMarkdown($file);
|
|
$serverFullPath = realpath(__DIR__ . '/../../storage/curriculum') . '/' . ltrim($file, '/');
|
|
|
|
$response->json([
|
|
'status' => 'success',
|
|
'file' => $file,
|
|
'server_full_path' => $serverFullPath,
|
|
'content' => $content
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Save Lesson Markdown Content
|
|
*/
|
|
public function saveLessonContent(Request $request, Response $response): void
|
|
{
|
|
$body = $request->getBody();
|
|
$file = $body['file'] ?? '';
|
|
$content = $body['content'] ?? '';
|
|
|
|
if (empty($file) || empty($content)) {
|
|
$response->status(400)->json(['status' => 'error', 'message' => 'بيانات الحفظ غير مكتملة']);
|
|
return;
|
|
}
|
|
|
|
CurriculumService::saveLessonMarkdown($file, $content);
|
|
$serverFullPath = realpath(__DIR__ . '/../../storage/curriculum') . '/' . ltrim($file, '/');
|
|
|
|
$response->json([
|
|
'status' => 'success',
|
|
'message' => 'تم حفظ واعتماد محتوى الدرس في المنهاج بنجاح!',
|
|
'server_full_path' => $serverFullPath
|
|
]);
|
|
}
|
|
}
|