schedule.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. from __future__ import annotations
  2. from datetime import datetime
  3. from fastapi import APIRouter
  4. from pydantic import BaseModel, Field
  5. from app.db import get_pool
  6. from app.services.scheduler import reschedule
  7. router = APIRouter(tags=["schedule"])
  8. class ScheduleOut(BaseModel):
  9. enabled: bool
  10. interval_days: int
  11. start_hour: int
  12. updated_at: datetime
  13. class ScheduleIn(BaseModel):
  14. enabled: bool
  15. interval_days: int = Field(ge=1)
  16. start_hour: int = Field(ge=0, le=23)
  17. @router.get("/schedule", response_model=ScheduleOut)
  18. async def get_schedule() -> ScheduleOut:
  19. pool = get_pool()
  20. async with pool.acquire() as conn:
  21. row = await conn.fetchrow("SELECT id, enabled, interval_days, start_hour, updated_at FROM scrape_schedule WHERE id = 1")
  22. return ScheduleOut(**dict(row))
  23. @router.put("/schedule", response_model=ScheduleOut)
  24. async def update_schedule(body: ScheduleIn) -> ScheduleOut:
  25. pool = get_pool()
  26. async with pool.acquire() as conn:
  27. row = await conn.fetchrow(
  28. """UPDATE scrape_schedule
  29. SET enabled=$1, interval_days=$2, start_hour=$3, updated_at=NOW()
  30. WHERE id=1 RETURNING id, enabled, interval_days, start_hour, updated_at""",
  31. body.enabled, body.interval_days, body.start_hour,
  32. )
  33. reschedule(body.interval_days, body.start_hour)
  34. return ScheduleOut(**dict(row))