from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException from sqlmodel import Session from ..db.session import get_session from ..schemas.ai_security import SecurityReviewScope from ..services import ai_security_reviewer from .connector_runtime import load_connector_runtime router = APIRouter(prefix='/api/ai/security', dependencies=[Depends(load_connector_runtime)]) @router.get('/status') def status(session: Session = Depends(get_session)): summary = ai_security_reviewer.get_summary(session) return { 'enabled': True, 'mode': 'deterministic_rule_based', 'externalAiRequired': False, 'canExecuteActions': False, 'status': summary['status'], 'score': summary['score'], 'generatedAt': summary['generatedAt'], } @router.get('/summary') def summary(session: Session = Depends(get_session)): return ai_security_reviewer.get_summary(session) @router.get('/findings') def findings(scope: SecurityReviewScope = 'all', session: Session = Depends(get_session)): return ai_security_reviewer.get_findings(session, scope) @router.get('/findings/{finding_id}') def finding_detail(finding_id: str, session: Session = Depends(get_session)): finding = ai_security_reviewer.get_finding(session, finding_id) if not finding: raise HTTPException(status_code=404, detail='finding_not_found') return finding @router.get('/recommendations') def recommendations(session: Session = Depends(get_session)): return ai_security_reviewer.get_recommendations(session) @router.post('/review') def review(session: Session = Depends(get_session)): return ai_security_reviewer.generate_review(session, audit_run=True).model_dump() @router.post('/review/scope/{scope}') def review_scope(scope: SecurityReviewScope, session: Session = Depends(get_session)): return ai_security_reviewer.generate_review(session, scope=scope, audit_run=True).model_dump() @router.post('/findings/{finding_id}/acknowledge') def acknowledge_finding(finding_id: str, session: Session = Depends(get_session)): return ai_security_reviewer.set_finding_status(session, finding_id, 'acknowledged') @router.post('/findings/{finding_id}/dismiss') def dismiss_finding(finding_id: str, session: Session = Depends(get_session)): return ai_security_reviewer.set_finding_status(session, finding_id, 'dismissed') @router.post('/recommendations/{recommendation_id}/snooze') def snooze_recommendation(recommendation_id: str, session: Session = Depends(get_session)): return ai_security_reviewer.set_recommendation_status(session, recommendation_id, 'snoozed') @router.post('/recommendations/{recommendation_id}/dismiss') def dismiss_recommendation(recommendation_id: str, session: Session = Depends(get_session)): return ai_security_reviewer.set_recommendation_status(session, recommendation_id, 'dismissed') @router.post('/recommendations/{recommendation_id}/accept') def accept_recommendation(recommendation_id: str, session: Session = Depends(get_session)): return ai_security_reviewer.set_recommendation_status(session, recommendation_id, 'accepted')