67 lines
2.1 KiB
Python
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")
|