76 lines
2.8 KiB
Python
76 lines
2.8 KiB
Python
from loguru import logger
|
|
from sqlalchemy.orm import Session
|
|
from datetime import datetime
|
|
import json
|
|
from typing import Dict, Any, Optional
|
|
|
|
from database.models import JiraAnalysis
|
|
from llm.models import JiraWebhookPayload
|
|
|
|
def create_analysis_record(db: Session, payload: JiraWebhookPayload) -> JiraAnalysis:
|
|
"""Creates a new Jira analysis record in the database."""
|
|
db_analysis = JiraAnalysis(
|
|
issue_key=payload.issueKey,
|
|
project_key=payload.projectKey,
|
|
status="pending",
|
|
issue_summary=payload.summary,
|
|
request_payload=payload.model_dump(),
|
|
created_at=datetime.utcnow(),
|
|
updated_at=datetime.utcnow()
|
|
)
|
|
db.add(db_analysis)
|
|
db.commit()
|
|
db.refresh(db_analysis)
|
|
return db_analysis
|
|
|
|
def get_analysis_record(db: Session, issue_key: str) -> Optional[JiraAnalysis]:
|
|
"""Retrieves the latest analysis record for a given Jira issue key."""
|
|
logger.debug(f"Attempting to retrieve analysis record for issue key: {issue_key}")
|
|
record = db.query(JiraAnalysis).filter(JiraAnalysis.issue_key == issue_key).order_by(JiraAnalysis.created_at.desc()).first()
|
|
if record:
|
|
logger.debug(f"Found analysis record for {issue_key}: {record.id}")
|
|
else:
|
|
logger.debug(f"No analysis record found for {issue_key}")
|
|
return record
|
|
|
|
def update_analysis_record(
|
|
db: Session,
|
|
record_id: int,
|
|
status: str,
|
|
analysis_result: Optional[Dict[str, Any]] = None,
|
|
error_message: Optional[str] = None,
|
|
raw_response: Optional[Dict[str, Any]] = None
|
|
) -> Optional[JiraAnalysis]:
|
|
"""Updates an existing Jira analysis record."""
|
|
db_analysis = db.query(JiraAnalysis).filter(JiraAnalysis.id == record_id).first()
|
|
if db_analysis:
|
|
db_analysis.status = status
|
|
db_analysis.updated_at = datetime.utcnow()
|
|
if analysis_result:
|
|
db_analysis.analysis_result = analysis_result
|
|
if error_message:
|
|
db_analysis.error_message = error_message
|
|
if raw_response:
|
|
db_analysis.raw_response = json.dumps(raw_response)
|
|
|
|
db.commit()
|
|
db.refresh(db_analysis)
|
|
return db_analysis
|
|
|
|
def get_all_analysis_records(db: Session) -> list[JiraAnalysis]:
|
|
"""Retrieves all analysis records from the database."""
|
|
return db.query(JiraAnalysis).all()
|
|
|
|
def get_analysis_by_id(db: Session, record_id: int) -> Optional[JiraAnalysis]:
|
|
"""Retrieves an analysis record by its unique database ID."""
|
|
return db.query(JiraAnalysis).filter(JiraAnalysis.id == record_id).first()
|
|
|
|
def delete_all_analysis_records(db: Session) -> int:
|
|
"""Deletes all analysis records from the database and returns count of deleted records."""
|
|
count = db.query(JiraAnalysis).count()
|
|
db.query(JiraAnalysis).delete()
|
|
db.commit()
|
|
return count
|
|
db.commit()
|
|
db.query(JiraAnalysis).delete()
|
|
db.commit() |