from datetime import datetime from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text, ForeignKey from sqlalchemy.orm import relationship from app.core.database import Base class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) email = Column(String, unique=True, index=True, nullable=False) username = Column(String, unique=True, index=True, nullable=False) hashed_password = Column(String, nullable=False) role = Column(String, default="user") # "user" or "admin" is_active = Column(Boolean, default=True) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) chat_messages = relationship("ChatMessage", back_populates="user") uploaded_files = relationship("UploadedFile", back_populates="user") class AIEndpoint(Base): __tablename__ = "ai_endpoints" id = Column(Integer, primary_key=True, index=True) name = Column(String, nullable=False) endpoint_type = Column(String, nullable=False) # "openai" or "ollama" base_url = Column(String, nullable=False) api_key = Column(String, nullable=True) # Optional for Ollama model_name = Column(String, nullable=False) is_active = Column(Boolean, default=True) is_default = Column(Boolean, default=False) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) class ChatMessage(Base): __tablename__ = "chat_messages" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) role = Column(String, nullable=False) # "user" or "assistant" content = Column(Text, nullable=False) endpoint_id = Column(Integer, ForeignKey("ai_endpoints.id"), nullable=True) created_at = Column(DateTime, default=datetime.utcnow) user = relationship("User", back_populates="chat_messages") endpoint = relationship("AIEndpoint") class UploadedFile(Base): __tablename__ = "uploaded_files" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) filename = Column(String, nullable=False) original_filename = Column(String, nullable=False) file_path = Column(String, nullable=False) file_size = Column(Integer, nullable=False) file_type = Column(String, nullable=True) created_at = Column(DateTime, default=datetime.utcnow) user = relationship("User", back_populates="uploaded_files")