has('pdo')) { return $container->get('pdo'); } // Fallback to creating a new PDO connection $host = $_ENV['DB_HOST'] ?? 'localhost'; $dbname = $_ENV['DB_NAME'] ?? 'medialib'; $username = $_ENV['DB_USER'] ?? 'root'; $password = $_ENV['DB_PASS'] ?? ''; try { return new \PDO( "mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password, [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, \PDO::ATTR_EMULATE_PREPARES => false, ] ); } catch (\PDOException $e) { throw new \Exception('Database connection failed: ' . $e->getMessage()); } } protected function success(Response $response, $data = null, int $status = 200): Response { $responseData = ['success' => true]; if ($data !== null) { $responseData['data'] = $data; } return $this->json($response, $responseData, $status); } protected function error(Response $response, string $message, int $status = 400, array $errors = []): Response { $responseData = [ 'success' => false, 'error' => [ 'message' => $message, 'code' => $status ] ]; if (!empty($errors)) { $responseData['error']['details'] = $errors; } return $this->json($response, $responseData, $status); } protected function getPaginationParams(Request $request): array { $params = $request->getQueryParams(); $page = max(1, (int)($params['page'] ?? 1)); $perPage = min(50, max(1, (int)($params['per_page'] ?? 20))); return [ 'page' => $page, 'per_page' => $perPage, 'offset' => ($page - 1) * $perPage ]; } protected function getAuthUser(Request $request): ?array { return $request->getAttribute('user'); } protected function isAdmin(Request $request): bool { $user = $this->getAuthUser($request); return $user && ($user['is_admin'] ?? false); } }