2026-02-05 18:36:19 +01:00
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
2026-02-05 15:09:05 +01:00
|
|
|
from app.schemas.base import CamelModel
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PokemonResponse(CamelModel):
|
|
|
|
|
id: int
|
2026-02-07 14:55:06 +01:00
|
|
|
pokeapi_id: int
|
2026-02-05 15:09:05 +01:00
|
|
|
national_dex: int
|
|
|
|
|
name: str
|
|
|
|
|
types: list[str]
|
|
|
|
|
sprite_url: str | None
|
|
|
|
|
|
|
|
|
|
|
2026-02-06 11:19:05 +01:00
|
|
|
class PaginatedPokemonResponse(CamelModel):
|
|
|
|
|
items: list[PokemonResponse]
|
|
|
|
|
total: int
|
|
|
|
|
limit: int
|
|
|
|
|
offset: int
|
|
|
|
|
|
|
|
|
|
|
2026-02-05 19:26:49 +01:00
|
|
|
class EvolutionResponse(CamelModel):
|
|
|
|
|
id: int
|
|
|
|
|
from_pokemon_id: int
|
|
|
|
|
to_pokemon: PokemonResponse
|
|
|
|
|
trigger: str
|
|
|
|
|
min_level: int | None
|
|
|
|
|
item: str | None
|
|
|
|
|
held_item: str | None
|
|
|
|
|
condition: str | None
|
2026-02-07 20:05:07 +01:00
|
|
|
region: str | None
|
2026-02-05 19:26:49 +01:00
|
|
|
|
|
|
|
|
|
2026-02-07 21:08:25 +01:00
|
|
|
class FamiliesResponse(CamelModel):
|
|
|
|
|
families: list[list[int]]
|
|
|
|
|
|
|
|
|
|
|
2026-02-05 15:09:05 +01:00
|
|
|
class RouteEncounterResponse(CamelModel):
|
|
|
|
|
id: int
|
|
|
|
|
route_id: int
|
|
|
|
|
pokemon_id: int
|
2026-02-08 12:07:42 +01:00
|
|
|
game_id: int
|
2026-02-05 15:09:05 +01:00
|
|
|
encounter_method: str
|
|
|
|
|
encounter_rate: int
|
2026-02-14 22:42:49 +01:00
|
|
|
condition: str = ""
|
2026-02-05 15:09:05 +01:00
|
|
|
min_level: int
|
|
|
|
|
max_level: int
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RouteEncounterDetailResponse(RouteEncounterResponse):
|
|
|
|
|
pokemon: PokemonResponse
|
2026-02-05 18:36:19 +01:00
|
|
|
|
|
|
|
|
|
2026-02-08 14:03:43 +01:00
|
|
|
class PokemonEncounterLocationItem(CamelModel):
|
|
|
|
|
route_id: int
|
|
|
|
|
route_name: str
|
|
|
|
|
encounter_method: str
|
|
|
|
|
encounter_rate: int
|
2026-02-14 22:42:49 +01:00
|
|
|
condition: str = ""
|
2026-02-08 14:03:43 +01:00
|
|
|
min_level: int
|
|
|
|
|
max_level: int
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PokemonEncounterLocationResponse(CamelModel):
|
|
|
|
|
game_id: int
|
|
|
|
|
game_name: str
|
|
|
|
|
encounters: list[PokemonEncounterLocationItem]
|
|
|
|
|
|
|
|
|
|
|
2026-02-05 18:36:19 +01:00
|
|
|
# --- Admin schemas ---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PokemonCreate(CamelModel):
|
2026-02-07 14:55:06 +01:00
|
|
|
pokeapi_id: int
|
2026-02-05 18:36:19 +01:00
|
|
|
national_dex: int
|
|
|
|
|
name: str
|
|
|
|
|
types: list[str]
|
|
|
|
|
sprite_url: str | None = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PokemonUpdate(CamelModel):
|
2026-02-07 14:55:06 +01:00
|
|
|
pokeapi_id: int | None = None
|
2026-02-05 18:36:19 +01:00
|
|
|
national_dex: int | None = None
|
|
|
|
|
name: str | None = None
|
|
|
|
|
types: list[str] | None = None
|
|
|
|
|
sprite_url: str | None = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RouteEncounterCreate(CamelModel):
|
|
|
|
|
pokemon_id: int
|
2026-02-08 12:07:42 +01:00
|
|
|
game_id: int
|
2026-02-05 18:36:19 +01:00
|
|
|
encounter_method: str
|
|
|
|
|
encounter_rate: int
|
2026-02-14 22:42:49 +01:00
|
|
|
condition: str = ""
|
2026-02-05 18:36:19 +01:00
|
|
|
min_level: int
|
|
|
|
|
max_level: int
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RouteEncounterUpdate(CamelModel):
|
|
|
|
|
encounter_method: str | None = None
|
|
|
|
|
encounter_rate: int | None = None
|
2026-02-14 22:42:49 +01:00
|
|
|
condition: str | None = None
|
2026-02-05 18:36:19 +01:00
|
|
|
min_level: int | None = None
|
|
|
|
|
max_level: int | None = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BulkImportItem(BaseModel):
|
2026-02-07 14:55:06 +01:00
|
|
|
pokeapi_id: int
|
2026-02-05 18:36:19 +01:00
|
|
|
national_dex: int
|
|
|
|
|
name: str
|
|
|
|
|
types: list[str]
|
|
|
|
|
sprite_url: str | None = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BulkImportResult(CamelModel):
|
|
|
|
|
created: int
|
|
|
|
|
updated: int
|
|
|
|
|
errors: list[str]
|
Improve admin panel UX with toasts, evolution CRUD, sorting, drag-and-drop, and responsive layout
Add sonner toast notifications to all mutations, evolution management backend
(CRUD endpoints with search/pagination) and frontend (form modal with pokemon
selector, paginated list page), sortable AdminTable columns (Region/Gen/Year
on Games), drag-and-drop route reordering via @dnd-kit, skeleton loading states,
card-styled table wrappers, and responsive mobile nav in AdminLayout.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 13:09:27 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# --- Evolution admin schemas ---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EvolutionAdminResponse(CamelModel):
|
|
|
|
|
id: int
|
|
|
|
|
from_pokemon_id: int
|
|
|
|
|
to_pokemon_id: int
|
|
|
|
|
from_pokemon: PokemonResponse
|
|
|
|
|
to_pokemon: PokemonResponse
|
|
|
|
|
trigger: str
|
|
|
|
|
min_level: int | None
|
|
|
|
|
item: str | None
|
|
|
|
|
held_item: str | None
|
|
|
|
|
condition: str | None
|
2026-02-07 20:05:07 +01:00
|
|
|
region: str | None
|
Improve admin panel UX with toasts, evolution CRUD, sorting, drag-and-drop, and responsive layout
Add sonner toast notifications to all mutations, evolution management backend
(CRUD endpoints with search/pagination) and frontend (form modal with pokemon
selector, paginated list page), sortable AdminTable columns (Region/Gen/Year
on Games), drag-and-drop route reordering via @dnd-kit, skeleton loading states,
card-styled table wrappers, and responsive mobile nav in AdminLayout.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 13:09:27 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class PaginatedEvolutionResponse(CamelModel):
|
|
|
|
|
items: list[EvolutionAdminResponse]
|
|
|
|
|
total: int
|
|
|
|
|
limit: int
|
|
|
|
|
offset: int
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class EvolutionCreate(CamelModel):
|
|
|
|
|
from_pokemon_id: int
|
|
|
|
|
to_pokemon_id: int
|
|
|
|
|
trigger: str
|
|
|
|
|
min_level: int | None = None
|
|
|
|
|
item: str | None = None
|
|
|
|
|
held_item: str | None = None
|
|
|
|
|
condition: str | None = None
|
2026-02-07 20:05:07 +01:00
|
|
|
region: str | None = None
|
Improve admin panel UX with toasts, evolution CRUD, sorting, drag-and-drop, and responsive layout
Add sonner toast notifications to all mutations, evolution management backend
(CRUD endpoints with search/pagination) and frontend (form modal with pokemon
selector, paginated list page), sortable AdminTable columns (Region/Gen/Year
on Games), drag-and-drop route reordering via @dnd-kit, skeleton loading states,
card-styled table wrappers, and responsive mobile nav in AdminLayout.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-07 13:09:27 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class EvolutionUpdate(CamelModel):
|
|
|
|
|
from_pokemon_id: int | None = None
|
|
|
|
|
to_pokemon_id: int | None = None
|
|
|
|
|
trigger: str | None = None
|
|
|
|
|
min_level: int | None = None
|
|
|
|
|
item: str | None = None
|
|
|
|
|
held_item: str | None = None
|
|
|
|
|
condition: str | None = None
|
2026-02-07 20:05:07 +01:00
|
|
|
region: str | None = None
|
2026-02-08 20:14:19 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# --- 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
|
2026-02-14 22:42:49 +01:00
|
|
|
condition: str = ""
|
2026-02-08 20:14:19 +01:00
|
|
|
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
|
2026-02-08 21:20:30 +01:00
|
|
|
condition_label: str | None = None
|
2026-02-08 20:14:19 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
2026-02-14 11:04:08 +01:00
|
|
|
game_slug: str | None = None
|
2026-02-08 20:14:19 +01:00
|
|
|
pokemon: list[BulkBossPokemonItem] = []
|