From 77ea745c754922a9a8a0e32765f4edc548da9f35 Mon Sep 17 00:00:00 2001 From: coder-bot Date: Mon, 17 Aug 2026 20:25:28 +0000 Subject: [PATCH] WIP checkpoint: Scaffold FastAPI backend project structure --- backend/.env.example | 10 ++++++++-- backend/app/config.py | 1 - backend/app/main.py | 16 +++++++++++++--- backend/app/models/session.py | 6 ++++-- backend/app/models/world.py | 8 ++++++-- 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/backend/.env.example b/backend/.env.example index 508ec96..cc0bd94 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -1,5 +1,5 @@ -# Database -DATABASE_URL=postgresql://agp_user:agp_password@localhost:5432/agp_db +# Database (async driver) +DATABASE_URL=postgresql+asyncpg://agp_user:agp_password@localhost:5432/agp_db # Redis REDIS_URL=redis://localhost:6379/0 @@ -10,5 +10,11 @@ ALGORITHM=HS256 ACCESS_TOKEN_EXPIRE_MINUTES=30 # App +APP_NAME=AGP Backend +APP_VERSION=0.1.0 DEBUG=true CORS_ORIGINS=http://localhost:8080,http://localhost:3000 + +# File uploads +UPLOAD_DIR=uploads +MAX_UPLOAD_SIZE_MB=100 diff --git a/backend/app/config.py b/backend/app/config.py index a6e3f1f..81a3f6e 100644 --- a/backend/app/config.py +++ b/backend/app/config.py @@ -33,7 +33,6 @@ class Settings(BaseSettings): env_file=".env", env_file_encoding="utf-8", case_sensitive=True, - extra="ignore", ) @property diff --git a/backend/app/main.py b/backend/app/main.py index e3210e0..1260c12 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -3,6 +3,7 @@ from contextlib import asynccontextmanager from fastapi import FastAPI +from fastapi.middleware.cors import CORSMiddleware from app.config import settings from app.routers import auth, users, worlds, assets @@ -17,12 +18,21 @@ async def lifespan(app: FastAPI): app = FastAPI( - title=settings.app_name, - version=settings.app_version, + title=settings.APP_NAME, + version=settings.APP_VERSION, description="Agentic Game Platform - Backend API", lifespan=lifespan, ) +# CORS +app.add_middleware( + CORSMiddleware, + allow_origins=settings.cors_origins_list, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + # Include routers app.include_router(auth.router, prefix="/api/auth", tags=["auth"]) app.include_router(users.router, prefix="/api/users", tags=["users"]) @@ -33,4 +43,4 @@ app.include_router(assets.router, prefix="/api/assets", tags=["assets"]) @app.get("/api/health") async def health_check(): """Simple health check endpoint.""" - return {"status": "ok", "app": settings.app_name} + return {"status": "ok", "app": settings.APP_NAME} diff --git a/backend/app/models/session.py b/backend/app/models/session.py index fa8bd07..9d804bf 100644 --- a/backend/app/models/session.py +++ b/backend/app/models/session.py @@ -1,4 +1,6 @@ -from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean +import uuid + +from sqlalchemy import Column, String, DateTime, ForeignKey, Boolean from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.database import Base @@ -7,7 +9,7 @@ from app.database import Base class Session(Base): __tablename__ = "sessions" - id = Column(String, primary_key=True) + id = Column(String(36), primary_key=True, default=lambda: str(uuid.uuid4())) user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) token = Column(String, unique=True, index=True, nullable=False) expires_at = Column(DateTime(timezone=True), nullable=False) diff --git a/backend/app/models/world.py b/backend/app/models/world.py index 97e37fc..d10e896 100644 --- a/backend/app/models/world.py +++ b/backend/app/models/world.py @@ -1,4 +1,5 @@ -from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Enum +from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey +from sqlalchemy.dialects.postgresql import ENUM from sqlalchemy.orm import relationship from sqlalchemy.sql import func import enum @@ -19,7 +20,10 @@ class World(Base): name = Column(String(255), nullable=False) description = Column(Text, nullable=True) owner_id = Column(Integer, ForeignKey("users.id"), nullable=False) - visibility = Column(Enum(WorldVisibility), default=WorldVisibility.PUBLIC) + visibility = Column( + ENUM(WorldVisibility, name="world_visibility", create_type=False), + default=WorldVisibility.PUBLIC, + ) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now())