from datetime import datetime, timezone from sqlalchemy import DateTime, ForeignKey, Index, Integer, String from sqlalchemy.orm import Mapped, mapped_column from db.base import Base def _utcnow() -> datetime: return datetime.now(timezone.utc) class IntentDocument(Base): """Подписка ветки на документ базы знаний (Спринт 7, часть A). M:N между ветками (`intents`) и загруженными документами (`documents`). На retrieval в `chat_service` для активной ветки берём список её `document_id` и фильтруем `vectorstore.query(document_ids=...)`. Если подписок нет — передаём пустой список, retrieval вернёт 0 чанков (это сознательный дефолт, см. SPRINTS.md Спринт 7). """ __tablename__ = "intent_documents" intent_id: Mapped[int] = mapped_column( ForeignKey("intents.id", ondelete="CASCADE"), primary_key=True ) document_id: Mapped[str] = mapped_column( String(36), ForeignKey("documents.id", ondelete="CASCADE"), primary_key=True, ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=_utcnow, nullable=False ) __table_args__ = ( Index("ix_intent_documents_document_id", "document_id"), )