diff --git a/lib/sanbase/external_services/coinmarketcap/ticker.ex b/lib/sanbase/external_services/coinmarketcap/ticker.ex index 95a14b29e6..606a9ae5e4 100644 --- a/lib/sanbase/external_services/coinmarketcap/ticker.ex +++ b/lib/sanbase/external_services/coinmarketcap/ticker.ex @@ -99,6 +99,30 @@ defmodule Sanbase.ExternalServices.Coinmarketcap.Ticker do end end + # Fetch quotes for single project + @spec fetch_data_by_slug(String.t()) :: {:error, String.t()} | {:ok, [%__MODULE__{}]} + def fetch_data_by_slug(slug) do + "v1/cryptocurrency/quotes/latest?slug=#{slug}&convert=USD,BTC" + |> get() + |> case do + {:ok, %Tesla.Env{status: 200, body: body}} -> + {:ok, parse_json(body)} + + {:ok, %Tesla.Env{status: status}} -> + error = "Failed fetching #{slug} information. Status: #{status}" + + Logger.warning(error) + {:error, error} + + {:error, error} -> + error_msg = "Error fetching #{slug} information. Error message #{inspect(error)}" + + Logger.error(error_msg) + + {:error, error_msg} + end + end + @spec parse_json(String.t()) :: [%__MODULE__{}] | no_return defp parse_json(json) do %{"data" => data} = @@ -108,6 +132,12 @@ defmodule Sanbase.ExternalServices.Coinmarketcap.Ticker do data = data |> Enum.map(fn project_data -> + project_data = + case project_data do + {_, %{"id" => _id} = data} -> data + %{"id" => _id} = data -> data + end + %{ "id" => id, "name" => name, diff --git a/lib/sanbase/external_services/coinmarketcap/ticker_fetcher.ex b/lib/sanbase/external_services/coinmarketcap/ticker_fetcher.ex index a8a93fde2c..5f76458911 100644 --- a/lib/sanbase/external_services/coinmarketcap/ticker_fetcher.ex +++ b/lib/sanbase/external_services/coinmarketcap/ticker_fetcher.ex @@ -43,6 +43,10 @@ defmodule Sanbase.ExternalServices.Coinmarketcap.TickerFetcher do Logger.info("[CMC] Fetching realtime data from coinmarketcap") # Fetch current coinmarketcap data for many tickers {:ok, tickers} = Ticker.fetch_data(opts) + # Add a special case for SAN token since it might be out of top 5K projects + {:ok, san_tickers} = Ticker.fetch_data_by_slug("santiment") + + tickers = tickers ++ san_tickers # Create a map where the coinmarketcap_id is key and the values is the list of # santiment slugs that have that coinmarketcap_id