jira-ai-fixer/api/routers/issues.py

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,
}