45 lines
1.3 KiB
Elixir
45 lines
1.3 KiB
Elixir
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
|