defmodule BinanceHttp.Api.Endpoint do alias BinanceHttp.Digest @secret Application.compile_env(:binance_http, :secret_key) @sign_auth_types [:trade, :margin, :user_data] def build(path, query, auth, nil) when auth in @sign_auth_types do build(path, query, auth, @secret) end def build(path, query, auth, secret) when auth in @sign_auth_types do query = Map.merge(query, %{recvWindow: 10_000}) url = base_url() <> path |> prepare_query_params(query) {signature, timestamp} = Digest.digest(secret, query) if Regex.match?(~r/\?/, url) do url <> "×tamp=#{timestamp}&signature=#{signature}" else url <> "?timestamp=#{timestamp}&signature=#{signature}" end end def build(path, query, _, _) do base_url() <> path |> prepare_query_params(query) end def prepare_query_params(url, params) when is_map(params) and map_size(params) > 0 do params |> Map.to_list() |> Enum.reduce(url, fn ({k, v}, url) -> if Regex.match?(~r/\?/, url) do "#{url}&#{k}=#{v}" else "#{url}?#{k}=#{v}" end end) end def prepare_query_params(url, _), do: url defp base_url do Application.get_env(:binance_http, :base_url) end end