dotfiles/app/lib/prymn_web/controllers/server_controller.ex

46 lines
1.3 KiB
Elixir
Raw Normal View History

2023-06-23 07:05:10 +00:00
defmodule PrymnWeb.ServerController do
alias Prymn.Servers
2023-07-09 16:41:41 +00:00
require Logger
use PrymnWeb, :controller
2023-06-23 07:05:10 +00:00
@doc """
Used by clients to request a new server connection to the prymn backend
validating their registration token.
"""
2023-07-09 16:41:41 +00:00
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
2023-06-23 07:05:10 +00:00
{:ok, _server} ->
json(conn, %{"connected" => true})
2023-07-09 16:41:41 +00:00
{:error, :invalid_ip} ->
Logger.error("could not register a server because we received an invalid ip")
2023-07-20 19:04:51 +00:00
put_status(conn, 422)
2023-07-09 16:41:41 +00:00
|> json(%{"errors" => ["invalid ip received"]})
{:error, :bad_token} ->
2023-07-20 19:04:51 +00:00
put_status(conn, 422)
2023-07-09 16:41:41 +00:00
|> json(%{"errors" => %{"token" => "token is not valid"}})
{:error, %Ecto.Changeset{} = changeset} ->
errors = Ecto.Changeset.traverse_errors(changeset, fn {msg, _} -> msg end)
2023-07-20 19:04:51 +00:00
put_status(conn, 422)
2023-07-09 16:41:41 +00:00
|> json(%{"errors" => errors})
2023-06-23 07:05:10 +00:00
{:error, error} ->
2023-07-09 16:41:41 +00:00
raise "An unhandled error was received #{inspect(error)}"
2023-06-23 07:05:10 +00:00
end
end
end