139 lines
4.5 KiB
PHP
139 lines
4.5 KiB
PHP
<?php
|
|
|
|
require_once __DIR__ . '/../vendor/autoload.php';
|
|
|
|
use App\Config\AppConfig;
|
|
use App\Controllers\AuthController;
|
|
use App\Controllers\SessionController;
|
|
use App\Controllers\MessageController;
|
|
use App\Controllers\ChatController;
|
|
use App\Controllers\UploadController;
|
|
use App\Controllers\ConfigController;
|
|
use App\Controllers\InstallController;
|
|
use App\Middleware\AuthMiddleware;
|
|
use App\Middleware\AdminMiddleware;
|
|
|
|
// 设置响应头
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
|
|
// CORS 设置
|
|
$corsOrigin = AppConfig::get('corsOrigin', '*');
|
|
header("Access-Control-Allow-Origin: {$corsOrigin}");
|
|
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
|
|
header('Access-Control-Allow-Headers: Content-Type, Authorization');
|
|
|
|
// 处理 OPTIONS 预检请求
|
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
|
http_response_code(200);
|
|
exit;
|
|
}
|
|
|
|
// 路由表定义
|
|
$routes = [
|
|
// 认证路由(无需认证)
|
|
['POST', 'auth/login', [AuthController::class, 'login'], false, false],
|
|
|
|
// 认证路由(需认证)
|
|
['GET', 'auth/me', [AuthController::class, 'me'], true, false],
|
|
|
|
// 会话路由
|
|
['GET', 'sessions', [SessionController::class, 'index'], true, false],
|
|
['POST', 'sessions', [SessionController::class, 'create'], true, false],
|
|
['PUT', 'sessions/{id}', [SessionController::class, 'update'], true, false],
|
|
['DELETE', 'sessions/{id}', [SessionController::class, 'delete'], true, false],
|
|
|
|
// 消息路由
|
|
['GET', 'sessions/{id}/messages', [MessageController::class, 'index'], true, false],
|
|
['POST', 'sessions/{id}/messages', [MessageController::class, 'create'], true, false],
|
|
|
|
// 聊天路由
|
|
['POST', 'chat/completions', [ChatController::class, 'completions'], true, false],
|
|
|
|
// 上传路由
|
|
['POST', 'upload', [UploadController::class, 'upload'], true, false],
|
|
|
|
// 配置路由
|
|
['GET', 'config', [ConfigController::class, 'getConfig'], true, false],
|
|
['PUT', 'config', [ConfigController::class, 'updateConfig'], true, true],
|
|
|
|
// 人格路由
|
|
['GET', 'personalities', [ConfigController::class, 'listPersonalities'], true, false],
|
|
['POST', 'personalities', [ConfigController::class, 'createPersonality'], true, true],
|
|
['PUT', 'personalities/{id}', [ConfigController::class, 'updatePersonality'], true, true],
|
|
['DELETE', 'personalities/{id}', [ConfigController::class, 'deletePersonality'], true, true],
|
|
|
|
// 安装路由(无需认证)
|
|
['GET', 'install/status', [InstallController::class, 'status'], false, false],
|
|
['POST', 'install/test-db', [InstallController::class, 'testDb'], false, false],
|
|
['POST', 'install/setup', [InstallController::class, 'setup'], false, false],
|
|
];
|
|
|
|
// 解析请求路径
|
|
$requestUri = $_SERVER['REQUEST_URI'];
|
|
$path = parse_url($requestUri, PHP_URL_PATH);
|
|
$basePath = '/api/';
|
|
|
|
// 去除 /api/ 前缀
|
|
if (str_starts_with($path, $basePath)) {
|
|
$path = substr($path, strlen($basePath));
|
|
}
|
|
$path = rtrim($path, '/');
|
|
|
|
$method = $_SERVER['REQUEST_METHOD'];
|
|
|
|
// 路由匹配
|
|
$matched = false;
|
|
|
|
try {
|
|
foreach ($routes as $route) {
|
|
[$routeMethod, $routePattern, $handler, $needAuth, $needAdmin] = $route;
|
|
|
|
if ($method !== $routeMethod) {
|
|
continue;
|
|
}
|
|
|
|
// 将路由模式转换为正则表达式
|
|
$paramNames = [];
|
|
$regexPattern = preg_replace_callback('/\{(\w+)\}/', function ($m) use (&$paramNames) {
|
|
$paramNames[] = $m[1];
|
|
return '([^/]+)';
|
|
}, $routePattern);
|
|
|
|
$regex = '#^' . $regexPattern . '$#';
|
|
|
|
if (preg_match($regex, $path, $matches)) {
|
|
$matched = true;
|
|
|
|
// 提取路径参数
|
|
$params = [];
|
|
for ($i = 0; $i < count($paramNames); $i++) {
|
|
$params[$paramNames[$i]] = $matches[$i + 1];
|
|
}
|
|
|
|
// 认证检查
|
|
if ($needAuth) {
|
|
AuthMiddleware::handle();
|
|
}
|
|
|
|
// 管理员检查
|
|
if ($needAdmin) {
|
|
AdminMiddleware::handle();
|
|
}
|
|
|
|
// 调用控制器方法
|
|
$controllerMethod = $handler[1];
|
|
$handler[0]::$controllerMethod(...array_values($params));
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!$matched) {
|
|
http_response_code(404);
|
|
echo json_encode(['success' => false, 'message' => '接口不存在']);
|
|
}
|
|
} catch (\Throwable $e) {
|
|
http_response_code(500);
|
|
echo json_encode(['success' => false, 'message' => '服务器内部错误']);
|
|
}
|