+ Federator.enqueue(:incoming_doc, doc)
+
+ conn
+ |> send_resp(200, "")
+ end
+
+ def object(conn, %{"uuid" => uuid}) do
+ if get_format(conn) == "activity+json" do
+ ActivityPubController.call(conn, :object)
+ else
+ with id <- o_status_url(conn, :object, uuid),
+ {_, %Activity{} = activity} <- {:activity, Activity.get_create_by_object_ap_id(id)},
+ {_, true} <- {:public?, ActivityPub.is_public?(activity)},
+ %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do
+ case get_format(conn) do
+ "html" -> redirect(conn, to: "/notice/#{activity.id}")
+ _ -> represent_activity(conn, nil, activity, user)
+ end
+ else
+ {:public?, false} ->
+ {:error, :not_found}
+
+ {:activity, nil} ->
+ {:error, :not_found}
+
+ e ->
+ e
+ end
+ end
+ end
+
+ def activity(conn, %{"uuid" => uuid}) do
+ if get_format(conn) == "activity+json" do
+ ActivityPubController.call(conn, :activity)
+ else
+ with id <- o_status_url(conn, :activity, uuid),
+ {_, %Activity{} = activity} <- {:activity, Activity.normalize(id)},
+ {_, true} <- {:public?, ActivityPub.is_public?(activity)},
+ %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do
+ case format = get_format(conn) do
+ "html" -> redirect(conn, to: "/notice/#{activity.id}")
+ _ -> represent_activity(conn, format, activity, user)
+ end
+ else
+ {:public?, false} ->
+ {:error, :not_found}
+
+ {:activity, nil} ->
+ {:error, :not_found}
+
+ e ->
+ e
+ end
+ end
+ end
+
+ def notice(conn, %{"id" => id}) do
+ with {_, %Activity{} = activity} <- {:activity, Activity.get_by_id(id)},
+ {_, true} <- {:public?, ActivityPub.is_public?(activity)},
+ %User{} = user <- User.get_cached_by_ap_id(activity.data["actor"]) do
+ case format = get_format(conn) do
+ "html" ->
+ if activity.data["type"] == "Create" do
+ %Object{} = object = Object.normalize(activity.data["object"])
+
+ Fallback.RedirectController.redirector_with_meta(conn, %{
+ object: object,
+ url:
+ Pleroma.Web.Router.Helpers.o_status_url(
+ Pleroma.Web.Endpoint,
+ :notice,
+ activity.id
+ ),
+ user: user
+ })
+ else
+ Fallback.RedirectController.redirector(conn, nil)
+ end
+
+ _ ->
+ represent_activity(conn, format, activity, user)
+ end
+ else
+ {:public?, false} ->
+ conn
+ |> put_status(404)
+ |> Fallback.RedirectController.redirector(nil, 404)
+
+ {:activity, nil} ->
+ conn
+ |> Fallback.RedirectController.redirector(nil, 404)
+
+ e ->
+ e
+ end
+ end
+
+ defp represent_activity(
+ conn,
+ "activity+json",
+ %Activity{data: %{"type" => "Create"}} = activity,
+ _user
+ ) do
+ object = Object.normalize(activity.data["object"])
+
+ conn
+ |> put_resp_header("content-type", "application/activity+json")
+ |> json(ObjectView.render("object.json", %{object: object}))
+ end
+
+ defp represent_activity(_conn, "activity+json", _, _) do
+ {:error, :not_found}
+ end
+
+ defp represent_activity(conn, _, activity, user) do
+ response =
+ activity
+ |> ActivityRepresenter.to_simple_form(user, true)
+ |> ActivityRepresenter.wrap_with_entry()
+ |> :xmerl.export_simple(:xmerl_xml)
+ |> to_string