aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pleroma/web/activity_pub/side_effects.ex34
-rw-r--r--priv/static/schemas/litepub-0.1.jsonld3
-rw-r--r--test/pleroma/web/activity_pub/side_effects_test.exs37
3 files changed, 72 insertions, 2 deletions
diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex
index aeddf3ed8..c4d56fa20 100644
--- a/lib/pleroma/web/activity_pub/side_effects.ex
+++ b/lib/pleroma/web/activity_pub/side_effects.ex
@@ -410,6 +410,26 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
{:ok, object, meta}
end
+ defp history_for_object(object) do
+ with history <- Map.get(object, "formerRepresentations"),
+ true <- is_map(history),
+ "OrderedCollection" <- Map.get(history, "type"),
+ true <- is_list(Map.get(history, "orderedItems")),
+ true <- is_integer(Map.get(history, "totalItems")) do
+ history
+ else
+ _ -> history_skeleton()
+ end
+ end
+
+ defp history_skeleton do
+ %{
+ "type" => "OrderedCollection",
+ "totalItems" => 0,
+ "orderedItems" => []
+ }
+ end
+
@updatable_object_types ["Note", "Question"]
# We do not allow poll options to be changed, but the poll description can be.
@updatable_fields [
@@ -431,6 +451,19 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
orig_object_data = orig_object.data
if orig_object_data["type"] in @updatable_object_types do
+ # Put edit history
+ # Note that we may have got the edit history by first fetching the object
+ history = history_for_object(orig_object_data)
+
+ latest_history_item =
+ orig_object_data
+ |> Map.drop(["id", "formerRepresentations"])
+
+ new_history =
+ history
+ |> Map.put("orderedItems", [latest_history_item | history["orderedItems"]])
+ |> Map.put("totalItems", history["totalItems"] + 1)
+
updated_object_data =
@updatable_fields
|> Enum.reduce(
@@ -443,6 +476,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
end
end
)
+ |> Map.put("formerRepresentations", new_history)
orig_object
|> Object.change(%{data: updated_object_data})
diff --git a/priv/static/schemas/litepub-0.1.jsonld b/priv/static/schemas/litepub-0.1.jsonld
index 946099a6e..650118475 100644
--- a/priv/static/schemas/litepub-0.1.jsonld
+++ b/priv/static/schemas/litepub-0.1.jsonld
@@ -36,7 +36,8 @@
"@id": "as:alsoKnownAs",
"@type": "@id"
},
- "vcard": "http://www.w3.org/2006/vcard/ns#"
+ "vcard": "http://www.w3.org/2006/vcard/ns#",
+ "formerRepresentations": "litepub:formerRepresentations"
}
]
}
diff --git a/test/pleroma/web/activity_pub/side_effects_test.exs b/test/pleroma/web/activity_pub/side_effects_test.exs
index f72753116..5c60504d4 100644
--- a/test/pleroma/web/activity_pub/side_effects_test.exs
+++ b/test/pleroma/web/activity_pub/side_effects_test.exs
@@ -153,7 +153,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do
{:ok, update_data, []} = Builder.update(user, updated_note)
{:ok, update, _meta} = ActivityPub.persist(update_data, local: true)
- %{user: user, object_id: note.id, update_data: update_data, update: update}
+ %{user: user, note: note, object_id: note.id, update_data: update_data, update: update}
end
test "it updates the note", %{object_id: object_id, update: update} do
@@ -161,6 +161,41 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do
new_note = Pleroma.Object.get_by_id(object_id)
assert %{"summary" => "edited summary", "content" => "edited content"} = new_note.data
end
+
+ test "it records the original note in formerRepresentations", %{
+ note: note,
+ object_id: object_id,
+ update: update
+ } do
+ {:ok, _, _} = SideEffects.handle(update)
+ %{data: new_note} = Pleroma.Object.get_by_id(object_id)
+ assert %{"summary" => "edited summary", "content" => "edited content"} = new_note
+
+ assert [Map.drop(note.data, ["id", "formerRepresentations"])] ==
+ new_note["formerRepresentations"]["orderedItems"]
+
+ assert new_note["formerRepresentations"]["totalItems"] == 1
+ end
+
+ test "it puts the original note at the front of formerRepresentations", %{
+ note: note,
+ object_id: object_id,
+ update: update
+ } do
+ {:ok, _, _} = SideEffects.handle(update)
+ %{data: first_edit} = Pleroma.Object.get_by_id(object_id)
+ {:ok, _, _} = SideEffects.handle(update)
+ %{data: new_note} = Pleroma.Object.get_by_id(object_id)
+ assert %{"summary" => "edited summary", "content" => "edited content"} = new_note
+
+ original_version = Map.drop(note.data, ["id", "formerRepresentations"])
+ first_edit = Map.drop(first_edit, ["id", "formerRepresentations"])
+
+ assert [first_edit, original_version] ==
+ new_note["formerRepresentations"]["orderedItems"]
+
+ assert new_note["formerRepresentations"]["totalItems"] == 2
+ end
end
describe "EmojiReact objects" do