feature/boss-sprites-and-badges (#22)
Reviewed-on: TheFurya/nuzlocke-tracker#22 Co-authored-by: Julian Tabel <juliantabel.jt@gmail.com> Co-committed-by: Julian Tabel <juliantabel.jt@gmail.com>
This commit was merged in pull request #22.
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from fastapi import APIRouter, Depends, HTTPException, Response
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy import or_, select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.orm import selectinload
|
||||
|
||||
@@ -43,15 +43,26 @@ async def _get_version_group_id(session: AsyncSession, game_id: int) -> int:
|
||||
|
||||
|
||||
@router.get("/games/{game_id}/bosses", response_model=list[BossBattleResponse])
|
||||
async def list_bosses(game_id: int, session: AsyncSession = Depends(get_session)):
|
||||
async def list_bosses(
|
||||
game_id: int,
|
||||
all: bool = False,
|
||||
session: AsyncSession = Depends(get_session),
|
||||
):
|
||||
vg_id = await _get_version_group_id(session, game_id)
|
||||
|
||||
result = await session.execute(
|
||||
query = (
|
||||
select(BossBattle)
|
||||
.where(BossBattle.version_group_id == vg_id)
|
||||
.options(selectinload(BossBattle.pokemon).selectinload(BossPokemon.pokemon))
|
||||
.order_by(BossBattle.order)
|
||||
)
|
||||
|
||||
if not all:
|
||||
query = query.where(
|
||||
or_(BossBattle.game_id.is_(None), BossBattle.game_id == game_id)
|
||||
)
|
||||
|
||||
result = await session.execute(query)
|
||||
return result.scalars().all()
|
||||
|
||||
|
||||
@@ -106,6 +117,14 @@ async def create_boss(
|
||||
):
|
||||
vg_id = await _get_version_group_id(session, game_id)
|
||||
|
||||
if data.game_id is not None:
|
||||
game = await session.get(Game, data.game_id)
|
||||
if game is None or game.version_group_id != vg_id:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="game_id does not belong to this version group",
|
||||
)
|
||||
|
||||
boss = BossBattle(version_group_id=vg_id, **data.model_dump())
|
||||
session.add(boss)
|
||||
await session.commit()
|
||||
@@ -128,6 +147,14 @@ async def update_boss(
|
||||
):
|
||||
vg_id = await _get_version_group_id(session, game_id)
|
||||
|
||||
if data.game_id is not None:
|
||||
game = await session.get(Game, data.game_id)
|
||||
if game is None or game.version_group_id != vg_id:
|
||||
raise HTTPException(
|
||||
status_code=400,
|
||||
detail="game_id does not belong to this version group",
|
||||
)
|
||||
|
||||
result = await session.execute(
|
||||
select(BossBattle)
|
||||
.where(BossBattle.id == boss_id, BossBattle.version_group_id == vg_id)
|
||||
@@ -192,10 +219,16 @@ async def bulk_import_bosses(
|
||||
)
|
||||
route_name_to_id = {row.name: row.id for row in result}
|
||||
|
||||
# Build game slug -> id mapping for game_slug resolution
|
||||
result = await session.execute(
|
||||
select(Game.slug, Game.id).where(Game.version_group_id == vg_id)
|
||||
)
|
||||
slug_to_game_id = {row.slug: row.id for row in result}
|
||||
|
||||
bosses_data = [item.model_dump() for item in items]
|
||||
try:
|
||||
count = await upsert_bosses(
|
||||
session, vg_id, bosses_data, dex_to_id, route_name_to_id
|
||||
session, vg_id, bosses_data, dex_to_id, route_name_to_id, slug_to_game_id
|
||||
)
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
|
||||
Reference in New Issue
Block a user