61 lines
2.5 KiB
Python
61 lines
2.5 KiB
Python
"""设置相关路由"""
|
||
from fastapi import APIRouter, Request, Depends
|
||
from app.core.db import get_db
|
||
from app.repositories.settings_repo import SettingsRepository
|
||
from app.models.schemas import SettingsSchema
|
||
from app.api.common import success_response
|
||
from app.api.deps import get_settings_repo
|
||
from app.core.exceptions import ProxyPoolException
|
||
from app.core.log import logger
|
||
|
||
router = APIRouter(prefix="/api/settings", tags=["settings"])
|
||
|
||
|
||
@router.get("")
|
||
async def get_settings(settings_repo: SettingsRepository = Depends(get_settings_repo)):
|
||
async with get_db() as db:
|
||
settings = await settings_repo.get_all(db)
|
||
return success_response("获取设置成功", settings)
|
||
|
||
|
||
@router.post("")
|
||
async def save_settings(
|
||
request: SettingsSchema,
|
||
http_request: Request,
|
||
settings_repo: SettingsRepository = Depends(get_settings_repo),
|
||
):
|
||
async with get_db() as db:
|
||
success = await settings_repo.save(db, request.model_dump())
|
||
if not success:
|
||
raise ProxyPoolException("保存设置失败", 500)
|
||
|
||
# 热更新运行中调度器的间隔时间
|
||
scheduler = getattr(http_request.app.state, "scheduler", None)
|
||
worker_pool = getattr(http_request.app.state, "worker_pool", None)
|
||
validator = getattr(http_request.app.state, "validator", None)
|
||
|
||
if scheduler:
|
||
new_interval = request.validate_interval_minutes
|
||
if scheduler.interval_minutes != new_interval:
|
||
scheduler.interval_minutes = new_interval
|
||
logger.info(f"Scheduler interval updated to {new_interval} minutes")
|
||
|
||
# 热更新 Worker 池大小
|
||
if worker_pool and worker_pool.worker_count != request.default_concurrency:
|
||
await worker_pool.resize(request.default_concurrency)
|
||
logger.info(f"Worker pool resized to {request.default_concurrency}")
|
||
|
||
# 热更新验证器超时和并发(下次验证时生效)
|
||
if validator:
|
||
validator._init_timeout = request.validation_timeout
|
||
validator._init_connect_timeout = request.validation_timeout
|
||
validator._init_max_concurrency = request.default_concurrency
|
||
if request.validation_targets:
|
||
validator.update_test_urls(request.validation_targets)
|
||
# 先关闭现有 session,再重置 semaphore,避免竞态窗口
|
||
await validator.close()
|
||
validator._semaphore = None
|
||
logger.info(f"Validator config updated: timeout={request.validation_timeout}, concurrency={request.default_concurrency}, targets={request.validation_targets}")
|
||
|
||
return success_response("保存设置成功", request.model_dump())
|