58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, Request
|
|
from fastapi.responses import JSONResponse
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.auth.dependencies import get_current_user, require_roles
|
|
from app.iptv.scheduler import StreamScheduler
|
|
from app.models.auth import CognitoUser
|
|
from app.utils.database import get_db
|
|
|
|
router = APIRouter(
|
|
prefix="/scheduler",
|
|
tags=["scheduler"],
|
|
responses={404: {"description": "Not found"}},
|
|
)
|
|
|
|
|
|
async def get_scheduler(request: Request) -> StreamScheduler:
|
|
"""Get the scheduler instance from the app state."""
|
|
if not hasattr(request.app.state.scheduler, "scheduler"):
|
|
raise HTTPException(status_code=500, detail="Scheduler not initialized")
|
|
return request.app.state.scheduler
|
|
|
|
|
|
@router.get("/health")
|
|
@require_roles("admin")
|
|
def scheduler_health(
|
|
scheduler: StreamScheduler = Depends(get_scheduler),
|
|
user: CognitoUser = Depends(get_current_user),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""Check scheduler health status (admin only)."""
|
|
try:
|
|
job = scheduler.scheduler.get_job("daily_stream_validation")
|
|
next_run = str(job.next_run_time) if job and job.next_run_time else None
|
|
|
|
return {
|
|
"status": "running" if scheduler.scheduler.running else "stopped",
|
|
"next_run": next_run,
|
|
}
|
|
except Exception as e:
|
|
raise HTTPException(
|
|
status_code=500, detail=f"Failed to check scheduler health: {str(e)}"
|
|
)
|
|
|
|
|
|
@router.post("/trigger")
|
|
@require_roles("admin")
|
|
def trigger_validation(
|
|
scheduler: StreamScheduler = Depends(get_scheduler),
|
|
user: CognitoUser = Depends(get_current_user),
|
|
db: Session = Depends(get_db),
|
|
):
|
|
"""Manually trigger stream validation (admin only)."""
|
|
scheduler.trigger_manual_validation()
|
|
return JSONResponse(
|
|
status_code=202, content={"message": "Stream validation triggered"}
|
|
)
|