44 lines
1.4 KiB
Python
44 lines
1.4 KiB
Python
|
|
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()
|