from sqlalchemy import Column, Integer, String, Boolean, ForeignKey, DateTime, UniqueConstraint from sqlalchemy.orm import relationship from sqlalchemy.sql import func from 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) hashed_password = Column(String, nullable=False) is_active = Column(Boolean, default=True) is_admin = Column(Boolean, default=False, nullable=False, server_default="false") sound_effects_enabled = Column(Boolean, default=False) display_name = Column(String, nullable=True) favorite_team = Column(String, nullable=True) banter_level = Column(String, default="Chill", nullable=False) conversations = relationship("Conversation", back_populates="owner") global_messages = relationship("GlobalMessage", back_populates="author") # Corrected typo here reactions = relationship("MessageReaction", back_populates="user", cascade="all, delete-orphan") class Conversation(Base): __tablename__ = "conversations" id = Column(Integer, primary_key=True, index=True) owner_id = Column(Integer, ForeignKey("users.id")) created_at = Column(DateTime(timezone=True), server_default=func.now()) owner = relationship("User", back_populates="conversations") messages = relationship("Message", back_populates="conversation", cascade="all, delete-orphan") class Message(Base): __tablename__ = "messages" id = Column(Integer, primary_key=True, index=True) conversation_id = Column(Integer, ForeignKey("conversations.id")) role = Column(String, nullable=False) content = Column(String, nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now()) conversation = relationship("Conversation", back_populates="messages") class GlobalMessage(Base): __tablename__ = "global_messages" id = Column(Integer, primary_key=True, index=True) author_id = Column(Integer, ForeignKey("users.id"), nullable=False) content = Column(String, nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now()) author = relationship("User", back_populates="global_messages") reactions = relationship("MessageReaction", back_populates="message", cascade="all, delete-orphan") class MessageReaction(Base): __tablename__ = "message_reactions" id = Column(Integer, primary_key=True, index=True) message_id = Column(Integer, ForeignKey("global_messages.id"), nullable=False) user_id = Column(Integer, ForeignKey("users.id"), nullable=False) emoji = Column(String, nullable=False) message = relationship("GlobalMessage", back_populates="reactions") user = relationship("User", back_populates="reactions") __table_args__ = (UniqueConstraint('message_id', 'user_id', 'emoji', name='_message_user_emoji_uc'),)