Packages

An work-in-progress elixir wrapper of the WealthSimple Trade REST API.

Current section

Files

Jump to
ws_trade lib auth.ex
Raw

lib/auth.ex

defmodule WsTrade.Auth do
@moduledoc false
require Logger
alias WsTrade.Auth.Client
alias WsTrade.Auth.TokenCache
@oauth_header_keys ["x-access-token", "x-refresh-token", "x-access-token-expires"]
def login(email, password) do
Client.login(email, password, "")
|> case do
{:ok, %{status: 401}} ->
Logger.debug("Got 401 from otp challenge")
{:ok, :otp_challenge_triggered}
{:ok, %{status: status} = resp} ->
Logger.error("Got unsupported status #{status}!\n#{inspect(resp)}")
{:error, :unsupported_status}
e ->
Logger.error("Remote call failed!\n#{inspect(e)}")
{:error, :remote_call_failed}
end
end
def login(email, password, otp_str) when is_binary(otp_str) do
Client.login(email, password, otp_str)
|> case do
{:ok, %{status: 200, headers: headers}} ->
Logger.debug("Login Successful.")
oauth_token =
headers
|> Map.new()
|> Map.take(@oauth_header_keys)
TokenCache.set_token(oauth_token)
{:ok, oauth_token}
{:ok, %{status: 401} = resp} ->
Logger.error("Incorrect credentials!\n#{inspect(resp)}")
{:error, :incorrect_credentials}
{:ok, %{status: status} = resp} ->
Logger.error("Got unsupported status #{status}!\n#{inspect(resp)}")
{:error, :unsupported_status}
e ->
Logger.error("Remote call failed!\n#{inspect(e)}")
{:error, :remote_call_failed}
end
end
def login(email, password, otp_provider_func) when is_function(otp_provider_func, 0) do
with {:ok, :otp_challenge_triggered} <- login(email, password),
{:ok, otp_str} <- otp_provider_func.(),
{:ok, oauth_token} <- login(email, password, otp_str) do
Logger.debug("Login successful.")
{:ok, oauth_token}
else
{:error, err} ->
Logger.error("Login failed!\n#{inspect(err)}")
{:error, err}
e ->
Logger.error("Login failed!\n#{inspect(e)}")
{:error, :unexpected_error}
end
end
end