diff --git a/backend/app/Controllers/VideoController.php b/backend/app/Controllers/VideoController.php index e0a3e4d..b72a95b 100644 --- a/backend/app/Controllers/VideoController.php +++ b/backend/app/Controllers/VideoController.php @@ -385,15 +385,17 @@ class VideoController VideoService::ensureSchema(); CurriculumService::ensureSchema(); - $lessonId = (int)$request->getParam('id'); + $rawId = $request->getParam('id') ?? ''; $lesson = null; - if ($lessonId > 0) { - $lesson = Database::selectOne("SELECT * FROM lessons WHERE id = ? LIMIT 1", [$lessonId]); + if (is_numeric($rawId) && (int)$rawId > 0) { + $lesson = Database::selectOne("SELECT * FROM lessons WHERE id = ? LIMIT 1", [(int)$rawId]); + } elseif (!empty($rawId)) { + $lesson = Database::selectOne("SELECT * FROM lessons WHERE file_path LIKE ? OR title LIKE ? LIMIT 1", ["%{$rawId}%", "%{$rawId}%"]); } if (!$lesson) { - // Fallback to latest available lesson + // Fallback to latest available lesson or create one $lesson = Database::selectOne("SELECT * FROM lessons ORDER BY id DESC LIMIT 1"); } @@ -408,8 +410,12 @@ class VideoController $existingCount = Database::selectOne("SELECT COUNT(*) as cnt FROM exams WHERE lesson_id = ? AND scope = 'in_video_checkpoint'", [$lessonId]); $existingQuestions = Database::selectOne("SELECT COUNT(*) as cnt FROM questions q JOIN exams e ON q.exam_id = e.id WHERE e.lesson_id = ?", [$lessonId]); if (empty($existingCount['cnt']) || empty($existingQuestions['cnt'])) { - AiVideoAnalyzerService::processLessonAutonomously($lessonId); - $lesson = Database::selectOne("SELECT * FROM lessons WHERE id = ? LIMIT 1", [$lessonId]); + try { + AiVideoAnalyzerService::processLessonAutonomously($lessonId); + $lesson = Database::selectOne("SELECT * FROM lessons WHERE id = ? LIMIT 1", [$lessonId]); + } catch (\Throwable $e) { + error_log("Autonomous video analysis notice: " . $e->getMessage()); + } } // Fetch attached in-video Socratic Checkpoints with Questions and Options diff --git a/backend/app/Core/Request.php b/backend/app/Core/Request.php index 1b124c1..c46d41f 100644 --- a/backend/app/Core/Request.php +++ b/backend/app/Core/Request.php @@ -13,6 +13,7 @@ class Request private array $queryParams; private array $bodyParams; private array $headers; + private array $routeParams = []; // Explicit properties to store authentication details to avoid deprecation warnings in PHP 8.2+ public ?int $user_id = null; @@ -78,6 +79,21 @@ class Request $this->queryParams = $queryParams; } + public function setParams(array $params): void + { + $this->routeParams = $params; + } + + public function getParams(): array + { + return $this->routeParams; + } + + public function getParam(string $key, $default = null) + { + return $this->routeParams[$key] ?? $default; + } + public function get(string $key, $default = null) { return $this->bodyParams[$key] ?? ($this->queryParams[$key] ?? $default); diff --git a/backend/app/Core/Router.php b/backend/app/Core/Router.php index 62e1188..a09bd57 100644 --- a/backend/app/Core/Router.php +++ b/backend/app/Core/Router.php @@ -88,6 +88,7 @@ class Router if ($route['method'] === $method && preg_match($route['pattern'], $path, $matches)) { // Filter named captures from regex match $params = array_filter($matches, 'is_string', ARRAY_FILTER_USE_KEY); + $request->setParams($params); // Run global middleware first foreach ($this->globalMiddleware as $mw) { @@ -108,13 +109,20 @@ class Router if (class_exists($controllerClass)) { $controller = new $controllerClass(); if (method_exists($controller, $action)) { - // Call action with Request, Response and URI dynamic parameters - call_user_func_array([$controller, $action], array_merge([$request, $response], $params)); + $ref = new \ReflectionMethod($controller, $action); + $paramCount = $ref->getNumberOfParameters(); + if ($paramCount <= 2) { + $controller->$action($request, $response); + } else { + $args = array_values(array_merge([$request, $response], array_values($params))); + call_user_func_array([$controller, $action], $args); + } return; } } } elseif (is_callable($handler)) { - call_user_func_array($handler, array_merge([$request, $response], $params)); + $args = array_values(array_merge([$request, $response], array_values($params))); + call_user_func_array($handler, $args); return; }