| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- """Experience case API router (basic CRUD for Phase 2)."""
- import json
- from fastapi import APIRouter, Depends, HTTPException, Query
- from sqlalchemy.orm import Session
- from ..database import get_db
- from ..models.experience_case import ExperienceCase
- router = APIRouter(prefix="/api/experience", tags=["experience"])
- def _case_to_dict(case: ExperienceCase) -> dict:
- return {
- "id": case.id,
- "source_plan_id": case.source_plan_id or "",
- "topology": case.topology or "SSSR",
- "model_path": case.model_path or "",
- "params": case.get_params(),
- "metrics": case.get_metrics(),
- "conclusion": case.conclusion or "",
- "tags": [t.strip() for t in (case.tags or "").split(",") if t.strip()],
- "rating": case.rating or 0,
- "created_at": case.created_at,
- }
- @router.get("")
- def list_experience(
- topology: str | None = None,
- tag: str | None = None,
- skip: int = 0,
- limit: int = 50,
- db: Session = Depends(get_db),
- ):
- """List experience cases with filters."""
- query = db.query(ExperienceCase)
- if topology:
- query = query.filter(ExperienceCase.topology == topology)
- if tag:
- query = query.filter(ExperienceCase.tags.contains(tag))
- total = query.count()
- cases = query.order_by(ExperienceCase.created_at.desc()).offset(skip).limit(limit).all()
- return {"total": total, "items": [_case_to_dict(c) for c in cases]}
- @router.post("", status_code=201)
- def create_experience(
- data: dict,
- db: Session = Depends(get_db),
- ):
- """Create an experience case from a dict."""
- case = ExperienceCase(
- source_plan_id=data.get("source_plan_id", ""),
- topology=data.get("topology", "SSSR"),
- model_path=data.get("model_path", ""),
- conclusion=data.get("conclusion", ""),
- tags=",".join(data.get("tags", [])),
- rating=data.get("rating", 0),
- )
- case.params_json = json.dumps(data.get("params", {}), ensure_ascii=False)
- case.metrics_json = json.dumps(data.get("metrics", {}), ensure_ascii=False)
- db.add(case)
- db.commit()
- db.refresh(case)
- return _case_to_dict(case)
- @router.get("/{case_id}")
- def get_experience(case_id: int, db: Session = Depends(get_db)):
- """Get an experience case by ID."""
- case = db.query(ExperienceCase).filter(ExperienceCase.id == case_id).first()
- if not case:
- raise HTTPException(status_code=404, detail="Experience case not found")
- return _case_to_dict(case)
- @router.delete("/{case_id}", status_code=204)
- def delete_experience(case_id: int, db: Session = Depends(get_db)):
- """Delete an experience case."""
- case = db.query(ExperienceCase).filter(ExperienceCase.id == case_id).first()
- if not case:
- raise HTTPException(status_code=404, detail="Experience case not found")
- db.delete(case)
- db.commit()
- return None
|