Wire browse-worlds screen to GET /api/worlds

- main_menu.gd: Play button now navigates to world_list.tscn
- world_list.gd: fix invalid theme_override_constants property-path syntax
  (use add_theme_constant_override), fix @onready node paths missing
  /HeaderHBox/, cast Variant dict values to String to avoid type-inference
  errors when cards actually render
- world_list.tscn: wire up Back/Refresh button signal connections (scene
  had zero [connection] blocks, buttons were dead)
- backend: fix real bug where World.visibility enum sent member names
  ("PUBLIC") to Postgres instead of lowercase values, breaking both GET
  and POST /api/worlds/ for any real query
- backend: fix WorldResponse.created_at typed as str instead of datetime,
  causing a second 500 on GET once the enum bug was fixed
- add smoke_test_world_list.gd: headless scene-level smoke test that
  registers a user, instantiates the real scene, and confirms world cards
  render from live backend data (not just an API-level check)
This commit is contained in:
2026-08-19 21:57:39 +00:00
parent 2ba6bc6b9f
commit b3227f5b78
7 changed files with 414 additions and 25 deletions
+2 -1
View File
@@ -1,5 +1,6 @@
"""Worlds router - CRUD for game worlds."""
from datetime import datetime
from typing import Annotated
from fastapi import APIRouter, Depends, HTTPException, Query
@@ -40,7 +41,7 @@ class WorldResponse(BaseModel):
description: str | None
visibility: WorldVisibility
owner_id: int
created_at: str | None = None
created_at: datetime | None = None
model_config = {"from_attributes": True}