updates
All checks were successful
Build and Deploy / Build & Push Image (push) Successful in 32s

This commit is contained in:
2026-03-25 21:36:51 -06:00
parent 9eff5041db
commit 991d284f69
3 changed files with 136 additions and 11 deletions

View File

@@ -68,21 +68,67 @@ defmodule CobblemonUi.PokeApi do
# ---------------------------------------------------------------------------
defp fetch_types(species) do
url = "https://pokeapi.co/api/v2/pokemon/#{species}"
api_name = CobblemonUi.PokeApiNames.normalize(species)
case fetch_types_direct(api_name) do
{:ok, types} ->
types
:not_found ->
# The /pokemon/ endpoint requires the specific form name (e.g.
# "aegislash-shield"). Fall back through the /pokemon-species/
# endpoint to resolve the default variety.
fetch_types_via_species(api_name)
end
end
defp fetch_types_direct(api_name) do
url = "https://pokeapi.co/api/v2/pokemon/#{api_name}"
case Req.get(url) do
{:ok, %Req.Response{status: 200, body: %{"types" => types}}} ->
types
|> Enum.sort_by(fn t -> t["slot"] end)
|> Enum.map(fn t -> get_in(t, ["type", "name"]) end)
|> Enum.reject(&is_nil/1)
parsed =
types
|> Enum.sort_by(fn t -> t["slot"] end)
|> Enum.map(fn t -> get_in(t, ["type", "name"]) end)
|> Enum.reject(&is_nil/1)
{:ok, parsed}
{:ok, %Req.Response{status: 404}} ->
:not_found
{:ok, %Req.Response{status: status}} ->
Logger.warning("[PokeApi] Type lookup failed for #{species}: HTTP #{status}")
[]
Logger.warning("[PokeApi] Type lookup failed for #{api_name}: HTTP #{status}")
{:ok, []}
{:error, reason} ->
Logger.warning("[PokeApi] Type lookup failed for #{species}: #{inspect(reason)}")
Logger.warning("[PokeApi] Type lookup failed for #{api_name}: #{inspect(reason)}")
{:ok, []}
end
end
defp fetch_types_via_species(api_name) do
url = "https://pokeapi.co/api/v2/pokemon-species/#{api_name}"
with {:ok, %Req.Response{status: 200, body: body}} <- Req.get(url),
%{"varieties" => varieties} <- body,
%{"pokemon" => %{"url" => pokemon_url}} <-
Enum.find(varieties, fn v -> v["is_default"] end) do
case Req.get(pokemon_url) do
{:ok, %Req.Response{status: 200, body: %{"types" => types}}} ->
types
|> Enum.sort_by(fn t -> t["slot"] end)
|> Enum.map(fn t -> get_in(t, ["type", "name"]) end)
|> Enum.reject(&is_nil/1)
_ ->
Logger.warning("[PokeApi] Fallback type lookup failed for #{api_name}")
[]
end
else
_ ->
Logger.warning("[PokeApi] Species fallback failed for #{api_name}")
[]
end
end