34 lines
928 B
Elixir
34 lines
928 B
Elixir
|
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_nickanme(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
|