diff --git a/lib/privacy_revolver.ex b/lib/privacy_revolver.ex deleted file mode 100644 index 5de8e06..0000000 --- a/lib/privacy_revolver.ex +++ /dev/null @@ -1,18 +0,0 @@ -defmodule PrivacyRevolver do - @moduledoc """ - Documentation for `PrivacyRevolver`. - """ - - @doc """ - Hello world. - - ## Examples - - iex> PrivacyRevolver.hello() - :world - - """ - def hello do - :world - end -end diff --git a/lib/privacy_revolver/application.ex b/lib/privacy_revolver/application.ex index de38e6e..e303646 100644 --- a/lib/privacy_revolver/application.ex +++ b/lib/privacy_revolver/application.ex @@ -6,7 +6,8 @@ defmodule PrivacyRevolver.Application do @impl true def start(_type, _args) do children = [ - Plug.Cowboy.child_spec(scheme: :http, plug: PrivacyRevolver.Router, options: [port: 4001]) + Plug.Cowboy.child_spec(scheme: :http, plug: PrivacyRevolver.Router, options: [port: 4001]), + {Redix, {"redis://localhost:6379", [name: :redix]}} ] opts = [strategy: :one_for_one, name: PrivacyRevolver.Supervisor] diff --git a/lib/privacy_revolver/router.ex b/lib/privacy_revolver/router.ex index cf702fe..c2c1c61 100644 --- a/lib/privacy_revolver/router.ex +++ b/lib/privacy_revolver/router.ex @@ -5,6 +5,25 @@ defmodule PrivacyRevolver.Router do plug :dispatch get "/ping" do - send_resp(conn, 200, "pong") + # Useful for app healthcheck + {:ok, resp} = Redix.command(:redix, ["PING"]) + send_resp(conn, 200, resp) + end + + get "/:service/*glob" do + full_path = "/" <> Enum.join(glob, "/") + {:ok, instances} = Redix.command(:redix, ["LRANGE", service, "0", "-1"]) + + # Either pick a random available instance, or fall back to the default one + instance = if Enum.count(instances) > 0 do + Enum.random(instances) + else + Redix.command(:redix, ["GET", service <> "-fallback"]) + end + + # Redirect to the available instance + conn |> + Plug.Conn.resp(:found, "") |> + Plug.Conn.put_resp_header("location", instance <> full_path) end end