Files
Priceflow/app/routers/jobs.py
T
2025-11-22 10:01:25 +01:00

62 lines
2.3 KiB
Python

from apscheduler.triggers.interval import IntervalTrigger
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Request
from sqlalchemy.orm import Session
from app import database, models, schemas
from app.limiter import limiter
from app.services.scheduler_service import process_item_check, scheduled_refresh, scheduler
from app.services.settings_service import SettingsService
router = APIRouter(prefix="/jobs", tags=["jobs"])
@router.get("/config")
def get_job_config(db: Session = Depends(database.get_db)):
interval = int(SettingsService.get_setting_value(db, "refresh_interval_minutes", "60"))
next_run = None
job = scheduler.get_job("refresh_job")
if job:
next_run = job.next_run_time
return {"refresh_interval_minutes": interval, "next_run": next_run, "running": scheduler.running}
@router.post("/config")
def update_job_config(config: schemas.SettingsUpdate, db: Session = Depends(database.get_db)):
if config.key != "refresh_interval_minutes":
raise HTTPException(status_code=400, detail="Invalid setting key for job config")
try:
interval = int(config.value)
if interval < 1:
raise ValueError("Interval must be at least 1 minute")
except ValueError as e:
raise HTTPException(status_code=400, detail="Invalid interval value") from e
SettingsService.update_setting(db, config)
try:
scheduler.reschedule_job("refresh_job", trigger=IntervalTrigger(minutes=interval))
except Exception:
scheduler.add_job(scheduled_refresh, IntervalTrigger(minutes=interval), id="refresh_job", replace_existing=True)
return {"message": "Job configuration updated", "refresh_interval_minutes": interval}
@router.post("/refresh-all")
@limiter.limit("5/minute")
def refresh_all_items(request: Request, background_tasks: BackgroundTasks, db: Session = Depends(database.get_db)):
items = db.query(models.Item).filter(models.Item.is_active).all()
# Mark all items as refreshing immediately so UI updates persist
for item in items:
item.is_refreshing = True
db.commit()
for item in items:
if item.id is not None:
background_tasks.add_task(process_item_check, int(item.id))
return {"message": f"Triggered refresh for {len(items)} items"}