mirror of
https://git.pleroma.social/pleroma/pleroma.git
synced 2024-12-23 00:26:30 +00:00
Record edit history for Note and Question Updates
This commit is contained in:
parent
0f6a5eb9a2
commit
5e8aac0e07
3 changed files with 72 additions and 2 deletions
|
@ -410,6 +410,26 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
|
||||||
{:ok, object, meta}
|
{:ok, object, meta}
|
||||||
end
|
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"]
|
@updatable_object_types ["Note", "Question"]
|
||||||
# We do not allow poll options to be changed, but the poll description can be.
|
# We do not allow poll options to be changed, but the poll description can be.
|
||||||
@updatable_fields [
|
@updatable_fields [
|
||||||
|
@ -431,6 +451,19 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
|
||||||
orig_object_data = orig_object.data
|
orig_object_data = orig_object.data
|
||||||
|
|
||||||
if orig_object_data["type"] in @updatable_object_types do
|
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 =
|
updated_object_data =
|
||||||
@updatable_fields
|
@updatable_fields
|
||||||
|> Enum.reduce(
|
|> Enum.reduce(
|
||||||
|
@ -443,6 +476,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
|
|> Map.put("formerRepresentations", new_history)
|
||||||
|
|
||||||
orig_object
|
orig_object
|
||||||
|> Object.change(%{data: updated_object_data})
|
|> Object.change(%{data: updated_object_data})
|
||||||
|
|
|
@ -36,7 +36,8 @@
|
||||||
"@id": "as:alsoKnownAs",
|
"@id": "as:alsoKnownAs",
|
||||||
"@type": "@id"
|
"@type": "@id"
|
||||||
},
|
},
|
||||||
"vcard": "http://www.w3.org/2006/vcard/ns#"
|
"vcard": "http://www.w3.org/2006/vcard/ns#",
|
||||||
|
"formerRepresentations": "litepub:formerRepresentations"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -153,7 +153,7 @@ defmodule Pleroma.Web.ActivityPub.SideEffectsTest do
|
||||||
{:ok, update_data, []} = Builder.update(user, updated_note)
|
{:ok, update_data, []} = Builder.update(user, updated_note)
|
||||||
{:ok, update, _meta} = ActivityPub.persist(update_data, local: true)
|
{: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
|
end
|
||||||
|
|
||||||
test "it updates the note", %{object_id: object_id, update: update} do
|
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)
|
new_note = Pleroma.Object.get_by_id(object_id)
|
||||||
assert %{"summary" => "edited summary", "content" => "edited content"} = new_note.data
|
assert %{"summary" => "edited summary", "content" => "edited content"} = new_note.data
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
describe "EmojiReact objects" do
|
describe "EmojiReact objects" do
|
||||||
|
|
Loading…
Reference in a new issue