Spaces:
Running
Running
| from sqlalchemy import Column, String, DateTime, func, ForeignKey, Text, Integer | |
| from sqlalchemy.dialects.postgresql import UUID, ARRAY | |
| from app.core.database import Base | |
| import uuid | |
| class Conversation(Base): | |
| """Một cuộc trò chuyện (session) với AI Stylist.""" | |
| __tablename__ = "chat_conversations" | |
| id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) | |
| user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False) | |
| title = Column(String(120), nullable=False, default="Cuộc trò chuyện mới") | |
| created_at = Column(DateTime(timezone=True), server_default=func.now()) | |
| updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) | |
| class ChatMessage(Base): | |
| """Một tin nhắn trong lịch sử trò chuyện với AI Stylist.""" | |
| __tablename__ = "chat_messages" | |
| id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) | |
| user_id = Column(UUID(as_uuid=True), ForeignKey("users.id", ondelete="CASCADE"), nullable=False) | |
| conversation_id = Column( | |
| UUID(as_uuid=True), ForeignKey("chat_conversations.id", ondelete="CASCADE"), nullable=True | |
| ) | |
| role = Column(String(10), nullable=False) # "user" | "ai" | |
| content = Column(Text, nullable=False) | |
| # Với tin nhắn "ai" là gợi ý phối đồ: các ID sản phẩm được chọn (để dựng lại thumbnail). | |
| selected_item_ids = Column(ARRAY(UUID(as_uuid=True)), nullable=True) | |
| # Số token LLM tiêu tốn cho tin nhắn "ai" này (dùng để tính quota trợ lý AI theo token). | |
| tokens_used = Column(Integer, nullable=False, server_default="0", default=0) | |
| created_at = Column(DateTime(timezone=True), server_default=func.now()) | |