diff --git a/backend/app/models/script.py b/backend/app/models/script.py new file mode 100644 index 0000000..aaf53ac --- /dev/null +++ b/backend/app/models/script.py @@ -0,0 +1,39 @@ +"""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")