fix: remove sla_breached, allow null issues_processed, fix query params

This commit is contained in:
Ricel Leite 2026-02-19 00:37:09 -03:00
parent 88a3a58117
commit 478d72d00a
4 changed files with 93 additions and 13 deletions

View File

@ -1,7 +1,7 @@
"""Issue management endpoints.""" """Issue management endpoints."""
from typing import List, Optional from typing import List, Optional
from datetime import datetime from datetime import datetime
from fastapi import APIRouter, Depends, HTTPException, status, BackgroundTasks from fastapi import APIRouter, Depends, HTTPException, status, BackgroundTasks, Query
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, func from sqlalchemy import select, func
from app.core.database import get_db from app.core.database import get_db
@ -76,8 +76,8 @@ async def run_analysis(issue_id: int, db_url: str):
@router.get("/", response_model=List[IssueRead]) @router.get("/", response_model=List[IssueRead])
async def list_issues( async def list_issues(
org_id: int, org_id: int,
status: Optional[IssueStatus] = None, status: Optional[IssueStatus] = Query(None),
source: Optional[str] = None, source: Optional[str] = Query(None),
limit: int = 50, limit: int = 50,
offset: int = 0, offset: int = 0,
member: OrganizationMember = Depends(require_role("viewer")), member: OrganizationMember = Depends(require_role("viewer")),
@ -141,13 +141,8 @@ async def get_stats(
) )
avg_confidence = avg_result.scalar() or 0 avg_confidence = avg_result.scalar() or 0
# SLA breached # SLA breached (disabled for now - field doesn't exist)
sla_result = await db.execute( sla_breached = 0
select(func.count(Issue.id))
.where(Issue.organization_id == org_id)
.where(Issue.sla_breached == True)
)
sla_breached = sla_result.scalar() or 0
return IssueStats( return IssueStats(
total=total, total=total,

View File

@ -39,7 +39,7 @@ class IntegrationRead(IntegrationBase):
base_url: Optional[str] = None base_url: Optional[str] = None
webhook_url: Optional[str] = None webhook_url: Optional[str] = None
auto_analyze: bool auto_analyze: bool
issues_processed: int issues_processed: Optional[int] = 0 # Allow None, default 0
last_sync_at: Optional[datetime] = None last_sync_at: Optional[datetime] = None
last_error: Optional[str] = None last_error: Optional[str] = None
created_at: datetime created_at: datetime

View File

@ -5,8 +5,8 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JIRA AI Fixer</title> <title>JIRA AI Fixer</title>
<link rel="icon" type="image/svg+xml" href="/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/favicon.svg">
<script type="module" crossorigin src="/assets/index-CbBXJad5.js"></script> <script type="module" crossorigin src="/assets/index-Be0hyHsH.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-BXtUC8s7.css"> <link rel="stylesheet" crossorigin href="/assets/index-gQZrNcqD.css">
</head> </head>
<body class="bg-gray-900 text-white"> <body class="bg-gray-900 text-white">
<div id="root"></div> <div id="root"></div>

85
test-e2e.sh Executable file
View File

@ -0,0 +1,85 @@
#!/bin/bash
set -e
BASE_URL="https://jira-fixer.startdata.com.br"
echo "=== JIRA AI Fixer - End-to-End Test ==="
echo ""
# 1. Health check
echo "1. Testing API health..."
HEALTH=$(curl -s "$BASE_URL/api/health")
echo " ✓ API: $HEALTH"
echo ""
# 2. Register user
echo "2. Registering admin user..."
REGISTER_RESP=$(curl -s -X POST "$BASE_URL/api/auth/register" \
-H "Content-Type: application/json" \
-d '{"email":"admin@startdata.com.br","password":"JiraFixer2026!","name":"Admin User"}')
TOKEN=$(echo "$REGISTER_RESP" | jq -r '.access_token')
if [ "$TOKEN" = "null" ] || [ -z "$TOKEN" ]; then
echo " Registration failed or user exists, trying login..."
LOGIN_RESP=$(curl -s -X POST "$BASE_URL/api/auth/login" \
-H "Content-Type: application/json" \
-d '{"email":"admin@startdata.com.br","password":"JiraFixer2026!"}')
TOKEN=$(echo "$LOGIN_RESP" | jq -r '.access_token')
fi
echo " ✓ Token: ${TOKEN:0:20}..."
echo ""
# 3. Create issue for SUPP-6
echo "3. Creating issue for SUPP-6..."
ISSUE_RESP=$(curl -s -X POST "$BASE_URL/api/issues" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Card validation accepts invalid card numbers (less than 16 digits)",
"description": "The VALIDATE.CBL module currently accepts credit card numbers with 10 or more digits instead of exactly 16 digits.\n\nFile: src/cobol/VALIDATE.CBL\nParagraph: 1000-VALIDATE-CARD\nLine: 29\nExpected: Card number must be exactly 16 digits\nActual: Card number is accepted if >= 10 digits\n\nRepository: https://gitea.startdata.com.br/startdata/cobol-sample-app\nBranch: main\nCommit: 4fae19b",
"external_key": "SUPP-6",
"priority": "high",
"repository": "https://gitea.startdata.com.br/startdata/cobol-sample-app"
}')
ISSUE_ID=$(echo "$ISSUE_RESP" | jq -r '.id')
echo " ✓ Issue created: ID=$ISSUE_ID"
echo ""
# 4. Wait for AI analysis (background task)
echo "4. Waiting for AI analysis (30s)..."
sleep 30
# 5. Check issue status
echo "5. Checking issue status..."
ISSUE_STATUS=$(curl -s "$BASE_URL/api/issues/$ISSUE_ID" \
-H "Authorization: Bearer $TOKEN")
STATUS=$(echo "$ISSUE_STATUS" | jq -r '.status')
CONFIDENCE=$(echo "$ISSUE_STATUS" | jq -r '.confidence')
PR_URL=$(echo "$ISSUE_STATUS" | jq -r '.pr_url')
echo " Status: $STATUS"
echo " Confidence: $CONFIDENCE%"
echo " PR URL: $PR_URL"
echo ""
# 6. Verify results
if [ "$STATUS" = "analyzed" ] && [ "$CONFIDENCE" -ge 70 ]; then
echo "✅ E2E TEST PASSED!"
echo " - Issue analyzed successfully"
echo " - High confidence fix ($CONFIDENCE%)"
if [ "$PR_URL" != "null" ]; then
echo " - PR created: $PR_URL"
fi
else
echo "⚠️ E2E TEST INCOMPLETE"
echo " Status: $STATUS (expected: analyzed)"
echo " Confidence: $CONFIDENCE% (expected: >= 70%)"
echo " This may take longer - check logs for details"
fi
echo ""
echo "=== Test Complete ==="