Split create activity specifics from update_outbox

This commit is contained in:
sxsdv1 2019-01-01 22:16:46 +01:00
parent 32bed66471
commit 551c3d9391
2 changed files with 44 additions and 15 deletions

View file

@ -165,9 +165,29 @@ def read_inbox(%{assigns: %{user: user}} = conn, %{"nickname" => nickname} = par
end end
end end
def handle_user_activity(user, %{"type" => "Create"} = params) do
object =
params["object"]
|> Map.merge(Map.take(params, ["to", "cc"]))
|> Map.put("attributedTo", user.ap_id())
|> Transmogrifier.fix_object()
ActivityPub.create(%{
to: params["to"],
actor: user,
context: object["context"],
object: object,
additional: Map.take(params, ["cc"])
})
end
def handle_user_activity(_, _) do
{:error, "Unhandled activity type"}
end
def update_outbox( def update_outbox(
%{assigns: %{user: user}} = conn, %{assigns: %{user: user}} = conn,
%{"nickname" => nickname, "type" => "Create"} = params %{"nickname" => nickname} = params
) do ) do
if nickname == user.nickname do if nickname == user.nickname do
actor = user.ap_id() actor = user.ap_id()
@ -178,24 +198,16 @@ def update_outbox(
|> Map.put("actor", actor) |> Map.put("actor", actor)
|> Transmogrifier.fix_addressing() |> Transmogrifier.fix_addressing()
object = with {:ok, %Activity{} = activity} <- handle_user_activity(user, params) do
params["object"]
|> Map.merge(Map.take(params, ["to", "cc"]))
|> Map.put("attributedTo", actor)
|> Transmogrifier.fix_object()
with {:ok, %Activity{} = activity} <-
ActivityPub.create(%{
to: params["to"],
actor: user,
context: object["context"],
object: object,
additional: Map.take(params, ["cc"])
}) do
conn conn
|> put_status(:created) |> put_status(:created)
|> put_resp_header("location", activity.data["id"]) |> put_resp_header("location", activity.data["id"])
|> json(activity.data) |> json(activity.data)
else
{:error, message} ->
conn
|> put_status(:bad_request)
|> json(message)
end end
else else
conn conn

View file

@ -192,6 +192,23 @@ test "it inserts an incoming activity into the database", %{conn: conn} do
result = json_response(conn, 201) result = json_response(conn, 201)
assert Activity.get_by_ap_id(result["id"]) assert Activity.get_by_ap_id(result["id"])
end end
test "it rejects an incoming activity with bogus type", %{conn: conn} do
data = File.read!("test/fixtures/activitypub-client-post-activity.json") |> Poison.decode!()
user = insert(:user)
data =
data
|> Map.put("type", "BadType")
conn =
conn
|> assign(:user, user)
|> put_req_header("content-type", "application/activity+json")
|> post("/users/#{user.nickname}/outbox", data)
assert json_response(conn, 400)
end
end end
describe "/users/:nickname/followers" do describe "/users/:nickname/followers" do