from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, ARRAY, Index from sqlalchemy.dialects.postgresql import ENUM from sqlalchemy.orm import relationship from sqlalchemy.sql import func import enum from app.database import Base class WorldVisibility(enum.Enum): PUBLIC = "public" PRIVATE = "private" FRIENDS_ONLY = "friends_only" class World(Base): __tablename__ = "worlds" id = Column(Integer, primary_key=True, index=True) name = Column(String(255), nullable=False) description = Column(Text, nullable=True) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) visibility = Column( ENUM(WorldVisibility, name="world_visibility", create_type=False), default=WorldVisibility.PUBLIC, ) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) # Discovery metadata category = Column(String(100), nullable=True, index=True) tags = Column(ARRAY(String), nullable=True, server_default="{}") play_count = Column(Integer, nullable=False, server_default="0") last_played_at = Column(DateTime(timezone=True), nullable=True) # GIN index on tags for efficient tag-based queries __table_args__ = ( Index("ix_worlds_tags", "tags", postgresql_using="gin"), ) owner = relationship("User", back_populates="worlds") assets = relationship("Asset", back_populates="world", cascade="all, delete-orphan") visits = relationship("WorldVisit", back_populates="world", cascade="all, delete-orphan")