defmodule FirebaseAdmin do
alias FirebaseAdmin.Client
alias FirebaseAdmin.Models.{User, ProviderInfo, Token}
def get_user(uid) do
case get_users_with(:localId, uid) do
{:ok, users} -> {:ok, List.first(users)}
error -> error
end
end
def get_users_with_phone(phone) do
get_users_with(:phoneNumber, phone)
end
def get_users_with_email(email) do
get_users_with(:email, email)
end
def get_user_with_phone(phone) do
get_user_with(:phoneNumber, phone)
end
def get_user_with_email(email) do
get_user_with(:email, email)
end
def token_for_user(%User{localId: uid}, service_account) when is_binary(uid) do
token_for_user(uid, service_account)
end
def token_for_user(uid, service_account) do
case uid |> Client.custom_token(service_account) |> Client.sign_in_with_custom_token() do
{:ok, %{status: 200, body: body}} ->
parse_token(body)
error ->
parse_error(error)
end
end
defp get_users_with(key, value) do
case Client.get_users_with(key, value) do
{:ok, %{status: 200, body: body}} ->
parse_users(body["users"])
error ->
parse_error(error)
end
end
defp get_user_with(key, value) do
case get_users_with(key, value) do
{:ok, users} -> {:ok, users |> List.first}
error -> error
end
end
defp parse_users(nil), do: {:ok, []}
defp parse_users(users) do
users = Poison.Decode.transform(users, %{as: [%User{providerUserInfo: [%ProviderInfo{}]}]})
{:ok, users}
end
defp parse_token(body) do
token = Poison.Decode.transform(body, %{as: %Token{}})
{:ok, token}
end
defp parse_error(error = {:error, _}), do: error
defp parse_error({:ok, %{body: body}}) do
message = body
|> Map.get("error", %{})
|> Map.get("message", "unknown error")
{:error, message}
end
end