safeLoad(); // Используем safeLoad вместо load для избежания ошибок // Настройка контейнера $container = new DI\Container(); // Настройка PDO $container->set('db', function () { // Загружаем переменные окружения внутри функции для уверенности $envPath = __DIR__ . '/../.env'; if (file_exists($envPath)) { $lines = file($envPath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach ($lines as $line) { if (strpos($line, '=') !== false && strpos($line, '#') !== 0) { list($key, $value) = explode('=', $line, 2); $key = trim($key); $value = trim($value); if (!isset($_ENV[$key]) && !isset($_SERVER[$key])) { putenv("$key=$value"); $_ENV[$key] = $value; $_SERVER[$key] = $value; } } } } $host = $_ENV['DB_HOST'] ?? $_SERVER['DB_HOST'] ?? getenv('DB_HOST') ?? 'localhost'; $dbname = $_ENV['DB_NAME'] ?? $_SERVER['DB_NAME'] ?? getenv('DB_NAME') ?? 'rsshub'; $username = $_ENV['DB_USER'] ?? $_SERVER['DB_USER'] ?? getenv('DB_USER') ?? 'rsshub'; $password = $_ENV['DB_PASS'] ?? $_SERVER['DB_PASS'] ?? getenv('DB_PASS') ?? 'rsshub_moloko22'; $dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4"; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, ]; return new PDO($dsn, $username, $password, $options); }); // Установка контейнера для фабрики приложений AppFactory::setContainer($container); $app = AppFactory::create(); // Добавление middleware для определения длины содержимого $app->addBodyParsingMiddleware(); $app->add(new ContentLengthMiddleware()); // Основной маршрут API $app->get('/api/feeds', [ApiController::class, 'getFeeds']); $app->post('/api/feeds', [ApiController::class, 'registerFeed']); $app->delete('/api/feeds/{id}', [ApiController::class, 'deleteFeed']); $app->get('/api/categories', [ApiController::class, 'getCategories']); $app->get('/api/tags', [ApiController::class, 'getTags']); // Маршруты для владельцев (агентов) $app->post('/api/owners/register', [OwnerController::class, 'registerOwner']); $app->get('/api/owners/me', [OwnerController::class, 'getOwnerByApiKey']); // Маршрут для главной страницы $app->get('/', function (Request $request, Response $response) { $response->getBody()->write(file_get_contents(__DIR__ . '/../templates/index.html')); return $response->withHeader('Content-Type', 'text/html'); }); // Маршрут для страницы лент $app->get('/feeds', function (Request $request, Response $response) { $response->getBody()->write(file_get_contents(__DIR__ . '/../templates/feeds.html')); return $response->withHeader('Content-Type', 'text/html'); }); // Маршрут для документации скилла $app->get('/SKILL.md', function (Request $request, Response $response) { $response->getBody()->write(file_get_contents(__DIR__ . '/../SKILL.md')); return $response->withHeader('Content-Type', 'text/plain'); }); // Маршрут для README $app->get('/README.md', function (Request $request, Response $response) { $response->getBody()->write(file_get_contents(__DIR__ . '/../README.md')); return $response->withHeader('Content-Type', 'text/plain'); }); // Обработка ошибок $errorMiddleware = $app->addErrorMiddleware($_ENV['APP_DEBUG'] ?? false, true, true); $app->run();