defmodule SurrealEx.Config do
defstruct kind: :none,
uri: "",
ns: "",
db: "",
_prepare: %{}
def get_config(module) do
# Design note:
# [X] We can have multiple connections.
# [X] Customize config with dynamic values, using configuration at PID level.
#
case Process.get(:conn_config, nil) do
nil -> conn_env_config(module)
config -> config
end
end
defp conn_env_config(module) do
env_config = Application.get_env(:surreal_ex, module)
case env_reads(env_config) do
nil -> SurrealEx.Exception.exception_config_file_should_be_edited(module)
config -> config
end
end
defp env_reads(env_config) do
case env_config[:interface] do
:http -> for_http(env_config)
_ -> nil
end
end
def set_config_pid(config) do
Process.put(:conn_config, config)
end
@doc ~S"""
Prepare connection configuration for HTTP with Basic Authorization
## Examples
iex> config = SurrealEx.Config.for_http("http://localhost:8000","testns","testdb","root","root")
iex> config.kind
:for_http
iex> config.uri
"http://localhost:8000"
iex> config.ns
"testns"
iex> config.db
"testdb"
iex> config = SurrealEx.Config.for_http("http://localhost:8000","testns","testdb","root","root")
iex> config._prepare
%{
headers: [
"NS": "testns",
"DB": "testdb",
"Authorization": "Basic cm9vdDpyb290",
"Accept": "application/json"
]
}
"""
def for_http(env_config) do
for_http(env_config[:uri], env_config[:ns], env_config[:db], env_config[:user], env_config[:pass])
end
def for_http(uri, ns, db, user, pass) do
basic_auth = Base.encode64("#{user}:#{pass}")
prepare_conn = %{
headers: [
"NS": ns,
"DB": db,
"Authorization": "Basic #{basic_auth}",
"Accept": "application/json"
]
}
%SurrealEx.Config{
kind: :for_http,
uri: uri,
ns: ns,
db: db,
_prepare: prepare_conn
}
end
end