"""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")