- ingest.py: 异常不再暴露客户端,改为通用错误消息+日志记录 - bzzoiro.py: 修复 normalize 重复调用,改为一次遍历缓存结果 - understat.py: 使用 Repository 替代原始 SQL
60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
"""采集路由。"""
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, HTTPException
|
|
|
|
from src.api.schemas import IngestBzzoiroRequest, IngestResponse, IngestUnderstatRequest, IngestInjuriesRequest, IngestSimpleResponse
|
|
from src.data.sources import get_source
|
|
from src.data.injuries import ingest_injuries
|
|
from src.db.unit_of_work import get_uow
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
router = APIRouter(prefix="/api/v1", tags=["ingest"])
|
|
|
|
|
|
@router.post("/ingest/bzzoiro", response_model=IngestResponse)
|
|
async def ingest_bzzoiro_route(req: IngestBzzoiroRequest):
|
|
"""触发 bzzoiro 采集。"""
|
|
source = get_source("bzzoiro")
|
|
try:
|
|
async with get_uow() as session:
|
|
result = await source.ingest(
|
|
session,
|
|
leagues=req.leagues,
|
|
date_from=req.date_from,
|
|
date_to=req.date_to,
|
|
status=req.status,
|
|
)
|
|
return IngestResponse(**result)
|
|
except Exception as e:
|
|
logger.exception("bzzoiro ingest failed")
|
|
raise HTTPException(500, "数据采集失败,请查看服务器日志")
|
|
|
|
|
|
@router.post("/ingest/understat", response_model=IngestSimpleResponse)
|
|
async def ingest_understat_route(req: IngestUnderstatRequest):
|
|
"""触发 understat xG 回填。"""
|
|
source = get_source("understat")
|
|
try:
|
|
async with get_uow() as session:
|
|
result = await source.ingest(session, league=req.league, season=req.season)
|
|
return IngestSimpleResponse(**result)
|
|
except Exception as e:
|
|
logger.exception("understat ingest failed")
|
|
raise HTTPException(500, "xG 回填失败,请查看服务器日志")
|
|
|
|
|
|
@router.post("/ingest/injuries", response_model=IngestSimpleResponse)
|
|
async def ingest_injuries_route(req: IngestInjuriesRequest):
|
|
"""触发伤停采集。"""
|
|
try:
|
|
async with get_uow() as session:
|
|
result = await ingest_injuries(session, date=req.date)
|
|
return IngestSimpleResponse(**result)
|
|
except Exception as e:
|
|
logger.exception("injuries ingest failed")
|
|
raise HTTPException(500, "伤停采集失败,请查看服务器日志")
|