From 9afe2d899e3ae0ec6d69bc4ec580395d8da597a7 Mon Sep 17 00:00:00 2001 From: coder-bot Date: Tue, 18 Aug 2026 21:09:34 +0000 Subject: [PATCH] =?UTF-8?q?WIP=20checkpoint:=20US-1:=20Asset=20Import=20Pi?= =?UTF-8?q?peline=20=E2=80=94=20glTF=20upload=20endpoint=20with=20metadata?= =?UTF-8?q?=20extraction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/models/asset.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/backend/app/models/asset.py b/backend/app/models/asset.py index 2955515..dd108ba 100644 --- a/backend/app/models/asset.py +++ b/backend/app/models/asset.py @@ -3,6 +3,8 @@ from sqlalchemy.dialects.postgresql import ENUM from sqlalchemy.orm import relationship from sqlalchemy.sql import func import enum +import json +from typing import Optional, List from app.database import Base @@ -38,3 +40,31 @@ class Asset(Base): owner = relationship("User", back_populates="assets") world = relationship("World", back_populates="assets") + + +class GLTFMetadata(BaseModel): + """Pydantic schema for glTF asset metadata.""" + mesh_count: Optional[int] = None + vertex_count: Optional[int] = None + has_animation: bool = False + texture_refs: Optional[List[str]] = None + tags: Optional[List[str]] = None + + model_config = {"from_attributes": True} + + +def parse_metadata_json(metadata_text: Optional[str]) -> dict: + """Parse the metadata_json text field into a dict, handling None gracefully.""" + if not metadata_text: + return {} + try: + return json.loads(metadata_text) + except (json.JSONDecodeError, TypeError): + return {} + + +def serialize_metadata(metadata: dict) -> Optional[str]: + """Serialize metadata dict to JSON string for storage.""" + if not metadata: + return None + return json.dumps(metadata)