58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
"""Integration model."""
|
|
from datetime import datetime
|
|
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Enum, Boolean, Text
|
|
from sqlalchemy.orm import relationship
|
|
from app.core.database import Base
|
|
import enum
|
|
|
|
class IntegrationType(str, enum.Enum):
|
|
JIRA_CLOUD = "jira_cloud"
|
|
JIRA_SERVER = "jira_server"
|
|
SERVICENOW = "servicenow"
|
|
ZENDESK = "zendesk"
|
|
GITHUB = "github"
|
|
GITLAB = "gitlab"
|
|
AZURE_DEVOPS = "azure_devops"
|
|
TICKETHUB = "tickethub"
|
|
CUSTOM_WEBHOOK = "custom_webhook"
|
|
|
|
class IntegrationStatus(str, enum.Enum):
|
|
ACTIVE = "active"
|
|
INACTIVE = "inactive"
|
|
ERROR = "error"
|
|
|
|
class Integration(Base):
|
|
__tablename__ = "integrations"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
organization_id = Column(Integer, ForeignKey("organizations.id"), nullable=False)
|
|
|
|
name = Column(String(255), nullable=False)
|
|
type = Column(Enum(IntegrationType), nullable=False)
|
|
status = Column(Enum(IntegrationStatus), default=IntegrationStatus.ACTIVE)
|
|
|
|
# Config
|
|
base_url = Column(String(1024))
|
|
api_key = Column(Text) # Encrypted
|
|
oauth_token = Column(Text)
|
|
webhook_secret = Column(String(255))
|
|
callback_url = Column(String(1024))
|
|
|
|
# Stats
|
|
issues_processed = Column(Integer, default=0)
|
|
last_sync_at = Column(DateTime)
|
|
last_error = Column(Text)
|
|
|
|
# Settings
|
|
auto_analyze = Column(Boolean, default=True)
|
|
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
# Relations
|
|
organization = relationship("Organization", back_populates="integrations")
|
|
issues = relationship("Issue", back_populates="integration")
|
|
|
|
@property
|
|
def webhook_url(self) -> str:
|
|
return f"https://jira-fixer.startdata.com.br/api/webhook/{self.organization_id}/{self.type.value}"
|