Add bulk import for evolutions, routes, and bosses

Add three new bulk import endpoints that accept the same JSON format as
their corresponding export endpoints, enabling round-trip compatibility:

- POST /evolutions/bulk-import (upsert by from/to pokemon pair)
- POST /games/{id}/routes/bulk-import (reuses seed loader for hierarchy)
- POST /games/{id}/bosses/bulk-import (reuses seed loader with team data)

Generalize BulkImportModal to support all entity types with configurable
title, example, and result labels. Wire up Bulk Import buttons on
AdminEvolutions, and AdminGameDetail routes/bosses tabs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-08 20:14:19 +01:00
parent 8e1c8b554f
commit 8f6d72a9c4
12 changed files with 373 additions and 15 deletions

View File

@@ -158,3 +158,60 @@ class EvolutionUpdate(CamelModel):
held_item: str | None = None
condition: str | None = None
region: str | None = None
# --- Bulk import schemas (match export format, snake_case) ---
class BulkEvolutionItem(BaseModel):
from_pokeapi_id: int
to_pokeapi_id: int
trigger: str
min_level: int | None = None
item: str | None = None
held_item: str | None = None
condition: str | None = None
region: str | None = None
class BulkRouteEncounterItem(BaseModel):
pokeapi_id: int
method: str
encounter_rate: int
min_level: int
max_level: int
class BulkRouteChildItem(BaseModel):
name: str
order: int
pinwheel_zone: int | None = None
encounters: list[BulkRouteEncounterItem] = []
class BulkRouteItem(BaseModel):
name: str
order: int
encounters: list[BulkRouteEncounterItem] = []
children: list[BulkRouteChildItem] = []
class BulkBossPokemonItem(BaseModel):
pokeapi_id: int
level: int
order: int
class BulkBossItem(BaseModel):
name: str
boss_type: str
specialty_type: str | None = None
badge_name: str | None = None
badge_image_url: str | None = None
level_cap: int
order: int
after_route_name: str | None = None
location: str
section: str | None = None
sprite_url: str | None = None
pokemon: list[BulkBossPokemonItem] = []