Packages

RIG, the Reactive Interaction Gateway, provides an easy (and scaleable) way to push messages from backend services to connected frontends (and vice versa).

Current section

Files

Jump to
rig lib rig_web proxy controller.ex
Raw

lib/rig_web/proxy/controller.ex

defmodule RigWeb.Proxy.Controller do
@moduledoc """
HTTP-accessible API for managing PROXY APIs.
"""
use Rig.Config, [:rig_proxy]
use RigWeb, :controller
require Logger
def list_apis(conn, _params) do
%{rig_proxy: proxy} = config()
api_defs = proxy.list_apis(proxy)
active_apis = for {_, api} <- api_defs, api["active"], do: api
send_response(conn, 200, active_apis)
end
def get_api_detail(conn, params) do
%{"id" => id} = params
case get_active_api(id) do
api when api == nil or api == :inactive ->
send_response(conn, 404, %{message: "API with id=#{id} doesn't exists."})
{_id, api} -> send_response(conn, 200, api)
end
end
def add_api(conn, params) do
%{"id" => id} = params
%{rig_proxy: proxy} = config()
with nil <- proxy.get_api(proxy, id),
{:ok, _phx_ref} <- proxy.add_api(proxy, id, params)
do
send_response(conn, 201, %{message: "ok"})
else
{_id, %{"active" => true}} ->
send_response(conn, 409, %{message: "API with id=#{id} already exists."})
{_id, %{"active" => false} = prev_api} ->
{:ok, _phx_ref} = proxy.replace_api(proxy, id, prev_api, params)
send_response(conn, 201, %{message: "ok"})
end
end
def update_api(conn, params) do
%{"id" => id} = params
with {_id, current_api} <- get_active_api(id),
{:ok, _phx_ref} <- merge_and_update(id, current_api, params)
do
send_response(conn, 200, %{message: "ok"})
else
api when api == nil or api == :inactive ->
send_response(conn, 404, %{message: "API with id=#{id} doesn't exists."})
end
end
def deactivate_api(conn, params) do
%{"id" => id} = params
%{rig_proxy: proxy} = config()
with {_id, _current_api} <- get_active_api(id),
{:ok, _phx_ref} <- proxy.deactivate_api(proxy, id)
do
send_response(conn, 204)
else
api when api == nil or api == :inactive ->
send_response(conn, 404, %{message: "API with id=#{id} doesn't exists."})
end
end
defp get_active_api(id) do
%{rig_proxy: proxy} = config()
with {id, current_api} <- proxy.get_api(proxy, id),
true <- current_api["active"] == true
do
{id, current_api}
else
nil -> nil
false -> :inactive
_ -> :error
end
end
defp merge_and_update(id, current_api, updated_api) do
%{rig_proxy: proxy} = config()
merged_api = current_api |> Map.merge(updated_api)
proxy.update_api(proxy, id, merged_api)
end
defp send_response(conn, status_code, body \\ %{}) do
conn
|> put_status(status_code)
|> json(body)
end
end