defmodule PrymnWeb.ServerController do alias Prymn.Servers require Logger use PrymnWeb, :controller @doc """ Used by clients to request a new server connection to the prymn backend validating their registration token. """ def register(conn, %{"token" => token}) do ip = with [ip] <- Plug.Conn.get_req_header(conn, "x-forwarded-for"), {:ok, ip} <- :inet.parse_address(to_charlist(ip)) do ip else {:error, reason} -> raise "Could not parse ip address: #{inspect(reason)}" [] -> conn.remote_ip end case Servers.register_server(token, ip) do {:ok, _server} -> json(conn, %{"connected" => true}) {:error, :invalid_ip} -> Logger.error("could not register a server because we received an invalid ip") put_status(conn, 422) |> json(%{"errors" => ["invalid ip received"]}) {:error, :bad_token} -> put_status(conn, 422) |> json(%{"errors" => %{"token" => "token is not valid"}}) {:error, %Ecto.Changeset{} = changeset} -> errors = Ecto.Changeset.traverse_errors(changeset, fn {msg, _} -> msg end) put_status(conn, 422) |> json(%{"errors" => errors}) {:error, error} -> raise "An unhandled error was received #{inspect(error)}" end end end