Adisri99's picture
Upload 26 files
1ce499f verified
import json
from fastapi import APIRouter, Depends
from app.database import get_db
from app.feature_engineering import normalize_object
from app.ingestion import fetch_celestrak_json
from app.repository import list_high_risk_pairs, latest_runs, get_run
from app.services import scoring_cycle, demo_objects
from app.scripts.train_baseline import run_training
router=APIRouter(prefix="/api/v1", tags=["admin"])
@router.post("/ingest/celestrak")
def ingest_celestrak(db=Depends(get_db)): return {"status":"ok", **scoring_cycle(db, [normalize_object(x) for x in fetch_celestrak_json()], source="celestrak")}
@router.post("/score/demo-cycle")
def score_demo_cycle(db=Depends(get_db)): return {"status":"ok", **scoring_cycle(db, demo_objects(db), source="demo")}
@router.post("/train/baseline")
def train_baseline():
model_path,rows,metrics=run_training(); return {"status":"ok","model_path":model_path,"rows_used":rows,"metrics":metrics}
@router.get("/alerts/live")
def alerts_live(limit:int=25, db=Depends(get_db)):
rows=list_high_risk_pairs(db, limit); return [{"pair_id":r.pair_id,"final_score":r.final_score,"risk_label":r.risk_label,"top_factors":json.loads(r.top_factors_json)} for r in rows]
@router.get("/runs")
def runs(db=Depends(get_db)): return [{"run_id":r.run_id,"source":r.source,"object_count":r.object_count,"candidate_pair_count":r.candidate_pair_count,"scored_pair_count":r.scored_pair_count,"completed":r.completed,"created_at":r.created_at} for r in latest_runs(db, 10)]
@router.get("/runs/{run_id}")
def run_detail(run_id:str, db=Depends(get_db)):
r=get_run(db, run_id)
if not r: return {"detail":"Run not found"}
rows=[x for x in list_high_risk_pairs(db,200) if x.latest_run_id==run_id]; labels={"low":0,"medium":0,"high":0,"critical":0}
for x in rows: labels[x.risk_label]=labels.get(x.risk_label,0)+1
return {"run_id":r.run_id,"source":r.source,"object_count":r.object_count,"candidate_pair_count":r.candidate_pair_count,"scored_pair_count":r.scored_pair_count,"completed":r.completed,"created_at":r.created_at,"label_distribution":labels,"top_pairs":[{"pair_id":x.pair_id,"final_score":x.final_score,"risk_label":x.risk_label} for x in sorted(rows, key=lambda z:z.final_score, reverse=True)[:20]]}