diff --git a/src/api/routes/schedules.py b/src/api/routes/schedules.py index c006b09..0b98486 100644 --- a/src/api/routes/schedules.py +++ b/src/api/routes/schedules.py @@ -8,7 +8,7 @@ from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select, delete from src.api.deps import require_admin -from src.api.schemas import ScheduleIn, ScheduleOut +from src.api.schemas import ScheduleIn, ScheduleUpdate, ScheduleOut from src.core.scheduler import scheduler from src.data.bzzoiro import ingest_bzzoiro_event_stats, ingest_bzzoiro_standings from src.data.sources import get_source @@ -98,21 +98,25 @@ async def create_schedule(req: ScheduleIn, db: AsyncSession = Depends(get_db_rea @router.put("/schedules/{schedule_id}") -async def update_schedule(schedule_id: str, req: ScheduleIn, db: AsyncSession = Depends(get_db_read)): - """更新定时任务。""" +async def update_schedule(schedule_id: str, req: ScheduleUpdate, db: AsyncSession = Depends(get_db_read)): + """更新定时任务(部分更新)。""" stmt = select(Schedule).where(Schedule.id == schedule_id) sched = (await db.execute(stmt)).scalar_one_or_none() if sched is None: raise HTTPException(404, "定时任务不存在") - sched.task = req.task - sched.cron = req.cron - sched.leagues = ",".join(req.leagues) if req.leagues else None - sched.enabled = req.enabled + if req.task is not None: + sched.task = req.task + if req.cron is not None: + sched.cron = req.cron + if req.leagues is not None: + sched.leagues = ",".join(req.leagues) if req.leagues else None + if req.enabled is not None: + sched.enabled = req.enabled await db.commit() - # 更新调度器 - scheduler.register(schedule_id, req.task, lambda: _run_scheduled_task(schedule_id), enabled=req.enabled) + # 更新调度器(使用最终值) + scheduler.register(schedule_id, sched.task, lambda: _run_scheduled_task(schedule_id), enabled=sched.enabled) return {"ok": True} diff --git a/src/api/schemas.py b/src/api/schemas.py index 0a581bd..9fc8993 100644 --- a/src/api/schemas.py +++ b/src/api/schemas.py @@ -129,6 +129,13 @@ class ScheduleIn(BaseModel): enabled: bool = True +class ScheduleUpdate(BaseModel): + task: str | None = None + cron: str | None = None + leagues: list[str] | None = None + enabled: bool | None = None + + class ScheduleOut(BaseModel): id: str task: str