]> Entropealabs - wampex_router.git/commitdiff
make database configurable with env vars
authorChristopher <chris@entropealabs.com>
Sun, 22 Mar 2020 01:03:32 +0000 (20:03 -0500)
committerChristopher <chris@entropealabs.com>
Sun, 22 Mar 2020 01:03:32 +0000 (20:03 -0500)
config/config.exs
lib/router/authentication/ensure_default_admin.ex
lib/router/authentication/repo.ex
mix.exs

index 1321bb37905861e5b735efed4bb62e9b12b76d70..e9dd40276bb68a2f7a3c36a3b5b8e4702cd47ce3 100644 (file)
@@ -18,7 +18,3 @@ config :wampex_router,
       list_nodes: {:erlang, :nodes, [:connected]}
     ]
   ]
-
-config :wampex_router,
-  ecto_repos: [Wampex.Router.Authentication.Repo],
-  keylen: 32
index 6a72096bde7891e485295e41e3662bf01d529ff7..423b02cf6244a0bf24a7c0dc18412dc3b8f67a49 100644 (file)
@@ -3,17 +3,27 @@ defmodule Wampex.Router.Authentication.EnsureDefaultAdmin do
   require Logger
   use GenServer
 
-  alias Wampex.Router.Authentication.{Realm, Peer}
+  alias Wampex.Router.Authentication.{Peer, Realm, Repo}
+  @ecto_repos [Repo]
 
   def start_link(uri: uri, authid: authid, password: password) do
     GenServer.start_link(__MODULE__, {uri, authid, password})
   end
 
   def init({uri, authid, password}) do
+    ensure_migrations()
     %Realm{} = realm = Realm.create(uri: uri)
     %Peer{} = user = Peer.create(authid: authid, password: password, realm: realm)
     Logger.debug("Realm: #{inspect(realm)}")
     Logger.debug("Peer: #{inspect(user)}")
     :ignore
   end
+
+  defp ensure_migrations do
+    Logger.info("Ensuring tables have been migrated")
+
+    for repo <- @ecto_repos() do
+      {:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :up, all: true))
+    end
+  end
 end
index e4236256c7406f32d350fa4d3fdcbc5929cfa07f..44fac5f8d1522457eb50cf389469d96cc9899f07 100644 (file)
@@ -2,4 +2,39 @@ defmodule Wampex.Router.Authentication.Repo do
   use Ecto.Repo,
     otp_app: :wampex_router,
     adapter: Ecto.Adapters.Postgres
+
+  alias __MODULE__
+  require Logger
+
+  def init(:runtime, config) do
+    config = update_config(config, :database, "AUTH_DATABASE_NAME", nil)
+    config = update_config(config, :hostname, "AUTH_DATABASE_HOSTAME", nil)
+    config = update_config(config, :port, "AUTH_DATABASE_PORT", &String.to_integer/1)
+    config = update_config(config, :username, "AUTH_DATABASE_USERNAME", nil)
+    {:ok, config}
+  end
+
+  def init(:supervisor, config) do
+    ensure_db_created(config)
+    {:ok, config}
+  end
+
+  def ensure_db_created(config) do
+    Logger.info("Ensuring DB exists")
+    r = Repo.__adapter__().storage_up(config)
+    Logger.info("DB Creation: #{inspect(r)}")
+  end
+
+  def update_config(config, key, env, format) do
+    case System.get_env(env) do
+      nil ->
+        config
+
+      val ->
+        Keyword.put(config, key, do_format(val, format))
+    end
+  end
+
+  def do_format(val, nil), do: val
+  def do_format(val, fmt), do: fmt.(val)
 end
diff --git a/mix.exs b/mix.exs
index d4bffb3dd835965f9cef29d445a4b1e80235eb04..b52e3e75a67b06adab2104b04b068cfc3c513160 100644 (file)
--- a/mix.exs
+++ b/mix.exs
@@ -31,7 +31,8 @@ defmodule Wampex.Router.MixProject do
 
   def application do
     [
-      extra_applications: [:logger]
+      extra_applications: [:logger],
+      env: [keylen: 32]
     ]
   end