Add REST API endpoints for games, runs, and encounters
Implement 13 endpoints: read-only reference data (games, routes, pokemon), run CRUD with cascading deletes, and encounter management. Uses Pydantic v2 with camelCase alias generation to match frontend types, and nested response schemas for detail views. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
43
backend/src/app/api/pokemon.py
Normal file
43
backend/src/app/api/pokemon.py
Normal file
@@ -0,0 +1,43 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.orm import joinedload
|
||||
|
||||
from app.core.database import get_session
|
||||
from app.models.pokemon import Pokemon
|
||||
from app.models.route import Route
|
||||
from app.models.route_encounter import RouteEncounter
|
||||
from app.schemas.pokemon import PokemonResponse, RouteEncounterDetailResponse
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/pokemon/{pokemon_id}", response_model=PokemonResponse)
|
||||
async def get_pokemon(
|
||||
pokemon_id: int, session: AsyncSession = Depends(get_session)
|
||||
):
|
||||
pokemon = await session.get(Pokemon, pokemon_id)
|
||||
if pokemon is None:
|
||||
raise HTTPException(status_code=404, detail="Pokemon not found")
|
||||
return pokemon
|
||||
|
||||
|
||||
@router.get(
|
||||
"/routes/{route_id}/pokemon",
|
||||
response_model=list[RouteEncounterDetailResponse],
|
||||
)
|
||||
async def list_route_encounters(
|
||||
route_id: int, session: AsyncSession = Depends(get_session)
|
||||
):
|
||||
# Verify route exists
|
||||
route = await session.get(Route, route_id)
|
||||
if route is None:
|
||||
raise HTTPException(status_code=404, detail="Route not found")
|
||||
|
||||
result = await session.execute(
|
||||
select(RouteEncounter)
|
||||
.where(RouteEncounter.route_id == route_id)
|
||||
.options(joinedload(RouteEncounter.pokemon))
|
||||
.order_by(RouteEncounter.encounter_rate.desc())
|
||||
)
|
||||
return result.scalars().unique().all()
|
||||
Reference in New Issue
Block a user