Add Phase 1 MVP: D&D text-adventure server

FastAPI + Postgres backend with fastapi-users auth, games/characters
CRUD, and a WebSocket chat endpoint where an x.ai Grok DM narrates
play, rolls dice, and maintains character sheets via tool calls.
React + Tailwind frontend covers registration/login, game list and
creation, participation-code join flow, character viewer, and a
real-time chat session view. Docker Compose skeleton (Postgres +
backend) included; Caddy/frontend container wiring is deferred to
the deploy milestone.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Thorsten
2026-08-31 18:43:08 +02:00
commit f37dc9fa76
75 changed files with 106988 additions and 0 deletions
View File
+25
View File
@@ -0,0 +1,25 @@
import uuid
from datetime import datetime
from pydantic import BaseModel
class CharacterRead(BaseModel):
id: uuid.UUID
owner_id: uuid.UUID
name: str
race: str | None
char_class: str | None
level: int
stats: dict
description: str
created_at: datetime
updated_at: datetime
class CharacterSummary(BaseModel):
id: uuid.UUID
name: str
race: str | None
char_class: str | None
level: int
+28
View File
@@ -0,0 +1,28 @@
import uuid
from datetime import datetime
from pydantic import BaseModel
class GameCreate(BaseModel):
name: str
description: str = ""
class GameRead(BaseModel):
id: uuid.UUID
name: str
description: str
creator_id: uuid.UUID
creator_name: str
player_count: int
player_names: list[str]
participation_code: str | None # only populated for the creator
created_at: datetime
is_participant: bool
my_character_id: uuid.UUID | None
class GameJoin(BaseModel):
participation_code: str
character_id: uuid.UUID | None = None
+19
View File
@@ -0,0 +1,19 @@
import uuid
from datetime import datetime
from pydantic import BaseModel
class MessageRead(BaseModel):
id: int
sender_type: str
user_id: uuid.UUID | None
player_name: str | None
character_id: uuid.UUID | None
character_name: str | None
content: str
created_at: datetime
class MessageCreate(BaseModel):
content: str
+15
View File
@@ -0,0 +1,15 @@
import uuid
from fastapi_users import schemas
class UserRead(schemas.BaseUser[uuid.UUID]):
name: str
class UserCreate(schemas.BaseUserCreate):
name: str
class UserUpdate(schemas.BaseUserUpdate):
name: str | None = None