Clawith/backend/app/models/channel_config.py

52 lines
2.0 KiB
Python

"""Channel configuration models."""
import uuid
from datetime import datetime
from sqlalchemy import DateTime, Enum, ForeignKey, String, Text, UniqueConstraint, func
from sqlalchemy.dialects.postgresql import JSON, UUID
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.database import Base
class ChannelConfig(Base):
"""Channel configuration for a digital employee (e.g. Feishu bot credentials)."""
__tablename__ = "channel_configs"
id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
agent_id: Mapped[uuid.UUID] = mapped_column(UUID(as_uuid=True), ForeignKey("agents.id"), nullable=False, index=True)
channel_type: Mapped[str] = mapped_column(
Enum("feishu", "wecom", "dingtalk", "slack", "discord","atlassian", "microsoft_teams", "agentbay", name="channel_type_enum"),
default="feishu",
nullable=False,
)
__table_args__ = (UniqueConstraint("agent_id", "channel_type", name="uq_channel_configs_agent_channel"),)
# Feishu specific config
app_id: Mapped[str | None] = mapped_column(String(255))
app_secret: Mapped[str | None] = mapped_column(String(512))
encrypt_key: Mapped[str | None] = mapped_column(String(255))
verification_token: Mapped[str | None] = mapped_column(String(255))
# Status
is_configured: Mapped[bool] = mapped_column(default=False)
is_connected: Mapped[bool] = mapped_column(default=False)
last_tested_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
# Additional config as JSON for extensibility
extra_config: Mapped[dict] = mapped_column(JSON, default={})
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
)
# Relationship
agent: Mapped["Agent"] = relationship(back_populates="channel_config")
from app.models.agent import Agent # noqa: E402, F401