From bc31bee7c4d5fc96d4c1923b61db7489b78f4558 Mon Sep 17 00:00:00 2001 From: lain Date: Mon, 2 Apr 2018 15:17:09 +0200 Subject: [PATCH] Generates contexts and ids on insertion time. --- lib/pleroma/web/activity_pub/utils.ex | 22 +++++++++++++++++-- .../web/twitter_api/views/activity_view.ex | 3 ++- test/web/activity_pub/activity_pub_test.exs | 21 +++++++++++++++++- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex index 16a1d3e97..ac3a57e03 100644 --- a/lib/pleroma/web/activity_pub/utils.ex +++ b/lib/pleroma/web/activity_pub/utils.ex @@ -45,6 +45,18 @@ def generate_id(type) do "#{Web.base_url()}/#{type}/#{UUID.generate()}" end + def create_context(context) do + context = context || generate_id("contexts") + changeset = Object.context_mapping(context) + + case Repo.insert(changeset) do + {:ok, object} -> object + # This should be solved by an upsert, but it seems ecto + # has problems accessing the constraint inside the jsonb. + {:error, _} -> Object.get_cached_by_ap_id(context) + end + end + @doc """ Enqueues an activity for federation if it's local """ @@ -67,13 +79,17 @@ def maybe_federate(_), do: :ok also adds it to an included object """ def lazy_put_activity_defaults(map) do + %{data: %{"id" => context}, id: context_id} = create_context(map["context"]) + map = map |> Map.put_new_lazy("id", &generate_activity_id/0) |> Map.put_new_lazy("published", &make_date/0) + |> Map.put_new("context", context) + |> Map.put_new("context_id", context_id) if is_map(map["object"]) do - object = lazy_put_object_defaults(map["object"]) + object = lazy_put_object_defaults(map["object"], map) %{map | "object" => object} else map @@ -83,10 +99,12 @@ def lazy_put_activity_defaults(map) do @doc """ Adds an id and published date if they aren't there. """ - def lazy_put_object_defaults(map) do + def lazy_put_object_defaults(map, activity \\ %{}) do map |> Map.put_new_lazy("id", &generate_object_id/0) |> Map.put_new_lazy("published", &make_date/0) + |> Map.put_new("context", activity["context"]) + |> Map.put_new("context_id", activity["context_id"]) end @doc """ diff --git a/lib/pleroma/web/twitter_api/views/activity_view.ex b/lib/pleroma/web/twitter_api/views/activity_view.ex index 0c5138503..dc4ca61c0 100644 --- a/lib/pleroma/web/twitter_api/views/activity_view.ex +++ b/lib/pleroma/web/twitter_api/views/activity_view.ex @@ -32,13 +32,14 @@ defp collect_context_ids(activities) do end) end - defp get_context_id(%{data: %{"context" => nil}}), do: nil + defp get_context_id(%{data: %{"context" => nil}}, _), do: nil defp get_context_id(%{data: %{"context" => context}}, options) do cond do id = options[:context_ids][context] -> id true -> TwitterAPI.context_to_conversation_id(context) end end + defp get_context_id(_, _), do: nil def render("index.json", opts) do context_ids = collect_context_ids(opts.activities) diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs index cf25abfc1..c6434f789 100644 --- a/test/web/activity_pub/activity_pub_test.exs +++ b/test/web/activity_pub/activity_pub_test.exs @@ -40,12 +40,31 @@ test "inserts a given map into the activity database, giving it an id if it has data = %{ "ok" => true, - "id" => given_id + "id" => given_id, + "context" => "blabla" } {:ok, %Activity{} = activity} = ActivityPub.insert(data) assert activity.data["ok"] == data["ok"] assert activity.data["id"] == given_id + assert activity.data["context"] == "blabla" + assert activity.data["context_id"] + end + + test "adds a context when none is there" do + data = %{ + "id" => "some_id", + "object" => %{ + "id" => "object_id" + } + } + + {:ok, %Activity{} = activity} = ActivityPub.insert(data) + + assert is_binary(activity.data["context"]) + assert is_binary(activity.data["object"]["context"]) + assert activity.data["context_id"] + assert activity.data["object"]["context_id"] end test "adds an id to a given object if it lacks one and is a note and inserts it to the object database" do