"""Script model — game logic scripts owned by users and associated with worlds.""" from typing import Optional from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, func from sqlalchemy.dialects.postgresql import ENUM, JSONB from sqlalchemy.orm import relationship import enum from app.database import Base class ScriptType(str, enum.Enum): """Type of script storage.""" GDSCRIPT = "gdscript" DSL = "dsl" class Script(Base): """A game script — either raw GDScript source or a DSL payload.""" __tablename__ = "scripts" id = Column(Integer, primary_key=True, index=True) name = Column(String(255), nullable=False) world_id = Column(Integer, ForeignKey("worlds.id", ondelete="CASCADE"), nullable=True) owner_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) source_code = Column(Text, nullable=True) version = Column(Integer, nullable=False, server_default="1") script_type = Column( ENUM(ScriptType, name="script_type", create_type=False), nullable=False, default=ScriptType.GDSCRIPT, ) dsl_payload = Column(JSONB, nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now()) owner = relationship("User", back_populates="scripts") world = relationship("World", back_populates="scripts")