diff --git a/synapse/events/utils.py b/synapse/events/utils.py
index 243696b357..9386fa29dd 100644
--- a/synapse/events/utils.py
+++ b/synapse/events/utils.py
@@ -425,6 +425,33 @@ class EventClientSerializer:
return serialized_event
+ def _apply_edit(
+ self, orig_event: EventBase, serialized_event: JsonDict, edit: EventBase
+ ) -> None:
+ """Replace the content, preserving existing relations of the serialized event.
+
+ Args:
+ orig_event: The original event.
+ serialized_event: The original event, serialized. This is modified.
+ edit: The event which edits the above.
+ """
+
+ # Ensure we take copies of the edit content, otherwise we risk modifying
+ # the original event.
+ edit_content = edit.content.copy()
+
+ # Unfreeze the event content if necessary, so that we may modify it below
+ edit_content = unfreeze(edit_content)
+ serialized_event["content"] = edit_content.get("m.new_content", {})
+
+ # Check for existing relations
+ relates_to = orig_event.content.get("m.relates_to")
+ if relates_to:
+ # Keep the relations, ensuring we use a dict copy of the original
+ serialized_event["content"]["m.relates_to"] = relates_to.copy()
+ else:
+ serialized_event["content"].pop("m.relates_to", None)
+
def _inject_bundled_aggregations(
self,
event: EventBase,
@@ -450,26 +477,11 @@ class EventClientSerializer:
serialized_aggregations[RelationTypes.REFERENCE] = aggregations.references
if aggregations.replace:
- # If there is an edit replace the content, preserving existing
- # relations.
+ # If there is an edit, apply it to the event.
edit = aggregations.replace
+ self._apply_edit(event, serialized_event, edit)
- # Ensure we take copies of the edit content, otherwise we risk modifying
- # the original event.
- edit_content = edit.content.copy()
-
- # Unfreeze the event content if necessary, so that we may modify it below
- edit_content = unfreeze(edit_content)
- serialized_event["content"] = edit_content.get("m.new_content", {})
-
- # Check for existing relations
- relates_to = event.content.get("m.relates_to")
- if relates_to:
- # Keep the relations, ensuring we use a dict copy of the original
- serialized_event["content"]["m.relates_to"] = relates_to.copy()
- else:
- serialized_event["content"].pop("m.relates_to", None)
-
+ # Include information about it in the relations dict.
serialized_aggregations[RelationTypes.REPLACE] = {
"event_id": edit.event_id,
"origin_server_ts": edit.origin_server_ts,
@@ -478,13 +490,22 @@ class EventClientSerializer:
# If this event is the start of a thread, include a summary of the replies.
if aggregations.thread:
+ thread = aggregations.thread
+
+ # Don't bundle aggregations as this could recurse forever.
+ serialized_latest_event = self.serialize_event(
+ thread.latest_event, time_now, bundle_aggregations=None
+ )
+ # Manually apply an edit, if one exists.
+ if thread.latest_edit:
+ self._apply_edit(
+ thread.latest_event, serialized_latest_event, thread.latest_edit
+ )
+
serialized_aggregations[RelationTypes.THREAD] = {
- # Don't bundle aggregations as this could recurse forever.
- "latest_event": self.serialize_event(
- aggregations.thread.latest_event, time_now, bundle_aggregations=None
- ),
- "count": aggregations.thread.count,
- "current_user_participated": aggregations.thread.current_user_participated,
+ "latest_event": serialized_latest_event,
+ "count": thread.count,
+ "current_user_participated": thread.current_user_participated,
}
# Include the bundled aggregations in the event.
|