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 ]); } }