models.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. """ORM models for ChatFast."""
  2. from sqlalchemy import Boolean, Column, DateTime, ForeignKey, Integer, String, Text
  3. from sqlalchemy.orm import relationship
  4. from .db import Base, now_utc
  5. class User(Base):
  6. __tablename__ = "users"
  7. id = Column(Integer, primary_key=True)
  8. username = Column(String(64), unique=True, nullable=False, index=True)
  9. password_hash = Column(String(128), nullable=False)
  10. salt = Column(String(32), nullable=False)
  11. role = Column(String(16), nullable=False, default="user")
  12. created_at = Column(DateTime, default=now_utc, nullable=False)
  13. updated_at = Column(DateTime, default=now_utc, onupdate=now_utc, nullable=False)
  14. sessions = relationship("ChatSession", back_populates="user", cascade="all, delete-orphan")
  15. class ChatSession(Base):
  16. __tablename__ = "chat_sessions"
  17. id = Column(Integer, primary_key=True)
  18. user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
  19. user_session_no = Column(Integer, nullable=False, default=0)
  20. title = Column(String(128), nullable=True)
  21. archived = Column(Boolean, default=False, nullable=False)
  22. created_at = Column(DateTime, default=now_utc, nullable=False)
  23. updated_at = Column(DateTime, default=now_utc, nullable=False)
  24. user = relationship("User", back_populates="sessions")
  25. messages = relationship("ChatMessage", back_populates="session", cascade="all, delete-orphan")
  26. class ChatMessage(Base):
  27. __tablename__ = "chat_messages"
  28. id = Column(Integer, primary_key=True)
  29. session_id = Column(
  30. Integer,
  31. ForeignKey("chat_sessions.id", ondelete="CASCADE"),
  32. nullable=False,
  33. index=True,
  34. )
  35. role = Column(String(16), nullable=False)
  36. content = Column(Text, nullable=False)
  37. created_at = Column(DateTime, default=now_utc, nullable=False)
  38. session = relationship("ChatSession", back_populates="messages")
  39. class AuthToken(Base):
  40. __tablename__ = "auth_tokens"
  41. token = Column(String(128), primary_key=True)
  42. user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
  43. expires_at = Column(DateTime, nullable=False)
  44. created_at = Column(DateTime, default=now_utc, nullable=False)
  45. user = relationship("User")
  46. class ExportedContent(Base):
  47. __tablename__ = "exported_contents"
  48. id = Column(Integer, primary_key=True)
  49. user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False, index=True)
  50. source_session_id = Column(Integer, ForeignKey("chat_sessions.id", ondelete="SET NULL"), nullable=True)
  51. filename = Column(String(255), nullable=False)
  52. file_path = Column(String(500), nullable=False)
  53. content_preview = Column(Text, nullable=True)
  54. created_at = Column(DateTime, default=now_utc, nullable=False)
  55. user = relationship("User")