""" SQLAlchemy модели для базы данных """ from sqlalchemy import Column, String, Text, Boolean, DateTime, ForeignKey, JSON, Integer from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from datetime import datetime import uuid from src.infrastructure.database.base import Base class UserModel(Base): """Модель пользователя""" __tablename__ = "users" user_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) telegram_id = Column(String, unique=True, nullable=False, index=True) role = Column(String, nullable=False, default="user") created_at = Column(DateTime, nullable=False, default=datetime.utcnow) collections = relationship("CollectionModel", back_populates="owner", cascade="all, delete-orphan") conversations = relationship("ConversationModel", back_populates="user", cascade="all, delete-orphan") collection_accesses = relationship("CollectionAccessModel", back_populates="user", cascade="all, delete-orphan") class CollectionModel(Base): """Модель коллекции""" __tablename__ = "collections" collection_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) name = Column(String, nullable=False) description = Column(Text, nullable=True) owner_id = Column(UUID(as_uuid=True), ForeignKey("users.user_id"), nullable=False) is_public = Column(Boolean, nullable=False, default=False) created_at = Column(DateTime, nullable=False, default=datetime.utcnow) owner = relationship("UserModel", back_populates="collections") documents = relationship("DocumentModel", back_populates="collection", cascade="all, delete-orphan") conversations = relationship("ConversationModel", back_populates="collection", cascade="all, delete-orphan") accesses = relationship("CollectionAccessModel", back_populates="collection", cascade="all, delete-orphan") class DocumentModel(Base): """Модель документа""" __tablename__ = "documents" document_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) collection_id = Column(UUID(as_uuid=True), ForeignKey("collections.collection_id"), nullable=False) title = Column(String, nullable=False) content = Column(Text, nullable=False) document_metadata = Column("metadata", JSON, nullable=True, default={}) created_at = Column(DateTime, nullable=False, default=datetime.utcnow) collection = relationship("CollectionModel", back_populates="documents") embeddings = relationship("EmbeddingModel", back_populates="document", cascade="all, delete-orphan") class EmbeddingModel(Base): """Модель эмбеддинга (заглушка)""" __tablename__ = "embeddings" embedding_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) document_id = Column(UUID(as_uuid=True), ForeignKey("documents.document_id"), nullable=False) embedding = Column(JSON, nullable=True) model_version = Column(String, nullable=True) created_at = Column(DateTime, nullable=False, default=datetime.utcnow) document = relationship("DocumentModel", back_populates="embeddings") class ConversationModel(Base): """Модель беседы""" __tablename__ = "conversations" conversation_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) user_id = Column(UUID(as_uuid=True), ForeignKey("users.user_id"), nullable=False) collection_id = Column(UUID(as_uuid=True), ForeignKey("collections.collection_id"), nullable=False) created_at = Column(DateTime, nullable=False, default=datetime.utcnow) updated_at = Column(DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) user = relationship("UserModel", back_populates="conversations") collection = relationship("CollectionModel", back_populates="conversations") messages = relationship("MessageModel", back_populates="conversation", cascade="all, delete-orphan") class MessageModel(Base): """Модель сообщения""" __tablename__ = "messages" message_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) conversation_id = Column(UUID(as_uuid=True), ForeignKey("conversations.conversation_id"), nullable=False) content = Column(Text, nullable=False) role = Column(String, nullable=False) sources = Column(JSON, nullable=True, default={}) created_at = Column(DateTime, nullable=False, default=datetime.utcnow) conversation = relationship("ConversationModel", back_populates="messages") class CollectionAccessModel(Base): """Модель доступа к коллекции""" __tablename__ = "collection_access" access_id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) user_id = Column(UUID(as_uuid=True), ForeignKey("users.user_id"), nullable=False) collection_id = Column(UUID(as_uuid=True), ForeignKey("collections.collection_id"), nullable=False) created_at = Column(DateTime, nullable=False, default=datetime.utcnow) user = relationship("UserModel", back_populates="collection_accesses") collection = relationship("CollectionModel", back_populates="accesses") __table_args__ = ( {"comment": "Уникальный доступ пользователя к коллекции"}, )