jira-ai-fixer/app/models/issue.py

67 lines
2.1 KiB
Python

"""Issue model."""
from datetime import datetime
from typing import Optional, List
from sqlalchemy import Column, Integer, String, Text, DateTime, Float, ForeignKey, Enum, JSON
from sqlalchemy.orm import relationship
from app.core.database import Base
import enum
class IssueStatus(str, enum.Enum):
PENDING = "pending"
ANALYZING = "analyzing"
ANALYZED = "analyzed"
PR_CREATED = "pr_created"
COMPLETED = "completed"
ERROR = "error"
class IssuePriority(str, enum.Enum):
CRITICAL = "critical"
HIGH = "high"
MEDIUM = "medium"
LOW = "low"
class Issue(Base):
__tablename__ = "issues"
id = Column(Integer, primary_key=True, index=True)
organization_id = Column(Integer, ForeignKey("organizations.id"), nullable=False)
integration_id = Column(Integer, ForeignKey("integrations.id"), nullable=True)
# External reference
external_id = Column(String(255), index=True)
external_key = Column(String(100), index=True) # JIRA-123, INC0001234
external_url = Column(String(1024))
source = Column(String(50)) # jira_cloud, servicenow, etc
# Issue data
title = Column(String(500), nullable=False)
description = Column(Text)
priority = Column(Enum(IssuePriority), default=IssuePriority.MEDIUM)
labels = Column(JSON)
# Analysis
status = Column(Enum(IssueStatus), default=IssueStatus.PENDING)
root_cause = Column(Text)
suggested_fix = Column(Text)
affected_files = Column(JSON)
confidence = Column(Float)
analysis_completed_at = Column(DateTime)
error_message = Column(Text)
# PR
pr_url = Column(String(1024))
pr_branch = Column(String(255))
# Callback
callback_url = Column(String(1024))
callback_sent = Column(DateTime)
# Meta
raw_payload = Column(JSON)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relations
organization = relationship("Organization", back_populates="issues")
integration = relationship("Integration", back_populates="issues")