diff --git a/lib/clacks/actor.ex b/lib/clacks/actor.ex index 63444e5..897d4da 100644 --- a/lib/clacks/actor.ex +++ b/lib/clacks/actor.ex @@ -27,6 +27,11 @@ defmodule Clacks.Actor do |> validate_required([:ap_id, :nickname, :local, :data]) end + @spec get_by_nickanme(nickname :: String.t()) :: t() | nil + def get_by_nickanme(nickname) do + Repo.one(from a in __MODULE__, where: a.nickname == ^nickname) + end + @spec get_by_ap_id(ap_id :: String.t(), force_refetch :: boolean()) :: t() | nil def get_by_ap_id(ap_id, force_refetch \\ false) do if force_refetch do diff --git a/lib/clacks_web/controllers/actor_controller.ex b/lib/clacks_web/controllers/actor_controller.ex new file mode 100644 index 0000000..c9cca06 --- /dev/null +++ b/lib/clacks_web/controllers/actor_controller.ex @@ -0,0 +1,22 @@ +defmodule ClacksWeb.ActorController do + use ClacksWeb, :controller + alias Clacks.{Repo, Actor} + import Ecto.Query + + def get(conn, %{"nickname" => nickname}) do + case Actor.get_by_nickanme(nickname) do + %Actor{local: true, data: data} -> + conn + |> put_resp_header("content-type", "application/activity+json") + |> json(data) + + %Actor{local: false, ap_id: ap_id} -> + conn + |> redirect(external: ap_id) + + _ -> + conn + |> put_status(404) + end + end +end diff --git a/lib/clacks_web/router.ex b/lib/clacks_web/router.ex index d9c9a17..61176c7 100644 --- a/lib/clacks_web/router.ex +++ b/lib/clacks_web/router.ex @@ -15,14 +15,13 @@ defmodule ClacksWeb.Router do scope "/", ClacksWeb do pipe_through :browser - - get "/", PageController, :index end scope "/", ClacksWeb do pipe_through :activitypub get "/objects/:id", ObjectsController, :get + get "/users/:nickname", ActorController, :get end # Other scopes may use custom stacks.