index.community/backend/lib/backend_web/controllers/admin_login_controller.ex

73 lines
2.2 KiB
Elixir

defmodule BackendWeb.AdminLoginController do
use BackendWeb, :controller
import Backend.Util
alias Backend.Api
alias Backend.Mailer.UserEmail
alias Mastodon.Messenger
action_fallback BackendWeb.FallbackController
@doc """
Given an instance, looks up the login types (email or admin account) and returns them. The user can then
choose one or the other by POSTing back.
"""
def show(conn, %{"id" => domain}) do
cleaned_domain = clean_domain(domain)
instance = Api.get_instance(domain)
keyword_args =
cond do
instance == nil or instance.type == nil ->
[error: "We have not seen this instance before. Please check for typos."]
not Enum.member?(["mastodon", "pleroma", "gab"], instance.type) ->
[error: "It is only possible to administer Mastodon and Pleroma instances."]
true ->
case get_and_decode("https://#{cleaned_domain}/api/v1/instance") do
{:ok, instance_data} ->
[instance_data: instance_data, cleaned_domain: cleaned_domain]
{:error, _err} ->
[error: "Unable to get instance details. Is it currently live?"]
end
end
render(conn, "show.json", keyword_args)
end
def create(conn, %{"domain" => domain, "type" => type}) do
cleaned_domain = clean_domain(domain)
{data_state, instance_data} =
get_and_decode("https://#{cleaned_domain}/api/v1/instance",
pool: :admin_login,
timeout: 20_000
)
error =
cond do
data_state == :error ->
"Unable to get instance details. Is it currently live?"
type == "email" ->
email = Map.get(instance_data, "email")
case UserEmail.send_login_email(email, cleaned_domain) do
{:ok, _} -> nil
{:error, _} -> "Failed to send email."
end
type == "fediverseAccount" ->
username = get_in(instance_data, ["contact_account", "username"])
_status = Messenger.dm_login_link(username, cleaned_domain)
nil
true ->
"Invalid account type. Must be 'email' or 'fediverseAccount'."
end
render(conn, "create.json", error: error)
end
end