Coverage for app\routers\trust.py: 40%
42 statements
« prev ^ index » next coverage.py v7.3.2, created at 2026-01-15 13:39 +0300
« prev ^ index » next coverage.py v7.3.2, created at 2026-01-15 13:39 +0300
1from fastapi import APIRouter, Depends, HTTPException
2from sqlalchemy.orm import Session
3from typing import List
4from datetime import datetime, UTC
5from .. import db as models
6from ..schemas import trust
7from ..db import SessionLocal
8from ..deps import get_db
10router = APIRouter()
12@router.post("/logs", response_model=trust.InferenceLog)
13def create_inference_log(log_in: trust.InferenceLogCreate, db: Session = Depends(get_db)):
14 """
15 Log an AI inference result and record usage for billing.
16 """
17 # 1. Create Log
18 log = models.InferenceLog(**log_in.model_dump())
19 db.add(log)
21 # 2. Billing Integration
22 # Check for active subscription
23 subscription = db.query(models.Subscription).filter(
24 models.Subscription.school_id == log_in.school_id,
25 models.Subscription.status == "active"
26 ).first()
28 # Record usage
29 # If no subscription, it still records usage (maybe for pay-as-you-go or audit)
30 usage = models.UsageRecord(
31 school_id=log_in.school_id,
32 subscription_id=subscription.id if subscription else None,
33 metric_key="ai_inference",
34 value=1.0, # 1 request count
35 dimension=log_in.module_id or "general",
36 recorded_at=datetime.now(UTC)
37 )
38 db.add(usage)
40 db.commit()
41 db.refresh(log)
42 return log
44@router.get("/logs", response_model=List[trust.InferenceLog])
45def get_inference_logs(skip: int = 0, limit: int = 100, school_id: str = None, db: Session = Depends(get_db)):
46 query = db.query(models.InferenceLog)
47 if school_id:
48 query = query.filter(models.InferenceLog.school_id == school_id)
49 logs = query.order_by(models.InferenceLog.timestamp.desc()).offset(skip).limit(limit).all()
50 return logs
52@router.get("/logs/{log_id}", response_model=trust.InferenceLog)
53def get_inference_log(log_id: str, db: Session = Depends(get_db)):
54 log = db.query(models.InferenceLog).filter(models.InferenceLog.id == log_id).first()
55 if not log:
56 raise HTTPException(status_code=404, detail="Log not found")
57 return log
59@router.post("/reviews", response_model=trust.JudgementReview)
60def create_judgement_review(review_in: trust.JudgementReviewCreate, reviewer_id: str = "current_user_id", db: Session = Depends(get_db)):
61 # In a real app, reviewer_id would come from the current authenticated user
62 log = db.query(models.InferenceLog).filter(models.InferenceLog.id == review_in.inference_id).first()
63 if not log:
64 raise HTTPException(status_code=404, detail="Inference Log not found")
66 review = models.JudgementReview(**review_in.model_dump(), reviewer_id=reviewer_id)
67 db.add(review)
68 db.commit()
69 db.refresh(review)
70 return review