defmodule SurrealEx.Conn do
@moduledoc """
Documentation for `SurrealEx.Conn`.
Design Notes: It is interesting can pipe actions (even diferente SQLs) and
can control easily the flow depending if the database answer was sucessfully or not.
config
|> sql(..query..)
|> when_ok_sql(..query..)
|> when_ok(..callback..)
|> when_error(..callback..)
"""
defmacro __using__(_opts) do
quote do
alias SurrealEx.Response
alias SurrealEx.HTTPAuth
def config() do
SurrealEx.Config.get_config(__MODULE__)
end
def set_config_pid(config) do
SurrealEx.Config.set_config_pid(config)
end
def sql(query) when is_bitstring(query) do
config()
|> sql(query)
end
def sql(query, token) when is_bitstring(query) and is_bitstring(token) do
config()
|> sql(query, token)
end
def sql(config = %SurrealEx.Config{kind: :for_http}, query) do
SurrealEx.HTTP.sql(config, query)
|> if_only_one_response_catchit()
end
def sql(config = %SurrealEx.Config{kind: :for_http}, query, token) do
SurrealEx.HTTPAuth.sql(config, query, token)
|> if_only_one_response_catchit()
end
def sql(_config , _query) do
{:error, "Please, review your configuration %SurrealEx.Config{...}."}
end
def sql(_config , _query, _token) do
{:error, "Please, review your configuration %SurrealEx.Config{...} or Token Authentication"}
end
defp if_only_one_response_catchit({:ok, [response]}) do
{:ok, response}
end
defp if_only_one_response_catchit(res), do: res
def when_ok({:ok, responses}, fn_callback_ok) do
case Response.all_status_ok?(responses) do
true -> fn_callback_ok.(responses)
_ -> {:ok, responses}
end
end
def when_ok(res,_query), do: res
def when_error({:error, responses}, fn_callback_error) do
fn_callback_error.(responses)
end
def when_error({:ok, responses}, fn_callback_error) do
case Response.all_status_ok?(responses) do
false -> fn_callback_error.(responses)
_ -> {:ok, responses}
end
end
def when_error(res,_query), do: res
def when_ok_sql(res, query) do
when_ok(res, fn _res ->
sql(query)
end)
end
def register(user), do: HTTPAuth.register(config(), user)
def register(username, password, email), do: HTTPAuth.register(config(), username, password, email)
def register(username, password, email, role), do: HTTPAuth.register(config(), username, password, email, role)
def login(username, password), do: HTTPAuth.login(config(), username, password)
def get_user_by_token(token), do: HTTPAuth.get_user_by_token(config(), token)
end
end
end