dotfiles/app/lib/prymn_web/controllers/server_controller.ex
2023-09-04 13:11:06 +03:00

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