defmodule ClacksWeb.WebFingerController do use ClacksWeb, :controller alias Clacks.Actor @acct_regex ~r/(?:acct:)?([a-z0-9_]+)(?:@.+)?/i def get(conn, %{"resource" => resource}) do with [_, nickname] <- Regex.run(@acct_regex, resource), %Actor{local: true} = actor <- Actor.get_by_nickname(nickname) do url = Application.get_env(:clacks, ClacksWeb.Endpoint)[:url] host = url[:host] port = url[:port] maybe_port = if port == URI.default_port(url[:scheme]), do: "", else: ":#{port}" conn |> json(%{ "subject" => "acct:#{actor.nickname}@#{host}#{maybe_port}", "links" => [ %{ "rel" => "self", "type" => "application/activity+json", "href" => actor.ap_id } ] }) else _ -> conn |> put_status(404) |> json(%{error: "No such resource"}) end end end