95 lines
2.2 KiB
Python
95 lines
2.2 KiB
Python
"""
|
|
Issue management API.
|
|
"""
|
|
from fastapi import APIRouter, HTTPException
|
|
from pydantic import BaseModel
|
|
from typing import Optional, List
|
|
from enum import Enum
|
|
from datetime import datetime
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
|
|
class IssueStatus(str, Enum):
|
|
PENDING = "pending"
|
|
ANALYZING = "analyzing"
|
|
ANALYZED = "analyzed"
|
|
FIX_GENERATED = "fix_generated"
|
|
PR_CREATED = "pr_created"
|
|
ACCEPTED = "accepted"
|
|
REJECTED = "rejected"
|
|
FAILED = "failed"
|
|
|
|
|
|
class AnalyzedIssue(BaseModel):
|
|
id: str
|
|
jira_key: str
|
|
title: str
|
|
status: IssueStatus
|
|
module: Optional[str] = None
|
|
confidence: Optional[float] = None
|
|
analysis_time_ms: Optional[int] = None
|
|
affected_files: List[str] = []
|
|
root_cause: Optional[str] = None
|
|
proposed_fix: Optional[str] = None
|
|
pr_url: Optional[str] = None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class IssueListResponse(BaseModel):
|
|
total: int
|
|
items: List[AnalyzedIssue]
|
|
|
|
|
|
@router.get("/", response_model=IssueListResponse)
|
|
async def list_issues(
|
|
status: Optional[IssueStatus] = None,
|
|
module: Optional[str] = None,
|
|
limit: int = 20,
|
|
offset: int = 0,
|
|
):
|
|
"""
|
|
List analyzed issues with optional filters.
|
|
"""
|
|
# TODO: Implement database query
|
|
return IssueListResponse(total=0, items=[])
|
|
|
|
|
|
@router.get("/{issue_id}", response_model=AnalyzedIssue)
|
|
async def get_issue(issue_id: str):
|
|
"""
|
|
Get details of a specific analyzed issue.
|
|
"""
|
|
# TODO: Implement database query
|
|
raise HTTPException(status_code=404, detail="Issue not found")
|
|
|
|
|
|
@router.post("/{issue_id}/reanalyze")
|
|
async def reanalyze_issue(issue_id: str):
|
|
"""
|
|
Trigger re-analysis of an issue.
|
|
"""
|
|
logger.info(f"🔄 Re-analyzing issue: {issue_id}")
|
|
# TODO: Queue for re-analysis
|
|
return {"status": "queued", "issue_id": issue_id}
|
|
|
|
|
|
@router.get("/stats/summary")
|
|
async def get_stats():
|
|
"""
|
|
Get summary statistics for dashboard.
|
|
"""
|
|
# TODO: Implement stats calculation
|
|
return {
|
|
"total_issues": 0,
|
|
"pending": 0,
|
|
"analyzed": 0,
|
|
"accepted": 0,
|
|
"rejected": 0,
|
|
"success_rate": 0.0,
|
|
"avg_analysis_time_ms": 0,
|
|
}
|