52
52
from synapse .http .site import SynapseRequest
53
53
from synapse .logging .context import make_deferred_yieldable , run_in_background
54
54
from synapse .logging .opentracing import set_tag
55
+ from synapse .metrics .background_process_metrics import run_as_background_process
55
56
from synapse .rest .client ._base import client_patterns
56
57
from synapse .rest .client .transactions import HttpTransactionCache
57
58
from synapse .storage .state import StateFilter
@@ -1029,6 +1030,8 @@ def __init__(self, hs: "HomeServer"):
1029
1030
super ().__init__ (hs )
1030
1031
self .event_creation_handler = hs .get_event_creation_handler ()
1031
1032
self .auth = hs .get_auth ()
1033
+ self ._relation_handler = hs .get_relations_handler ()
1034
+ self ._msc3912_enabled = hs .config .experimental .msc3912_enabled
1032
1035
1033
1036
def register (self , http_server : HttpServer ) -> None :
1034
1037
PATTERNS = "/rooms/(?P<room_id>[^/]*)/redact/(?P<event_id>[^/]*)"
@@ -1045,20 +1048,46 @@ async def on_POST(
1045
1048
content = parse_json_object_from_request (request )
1046
1049
1047
1050
try :
1048
- (
1049
- event ,
1050
- _ ,
1051
- ) = await self .event_creation_handler .create_and_send_nonmember_event (
1052
- requester ,
1053
- {
1054
- "type" : EventTypes .Redaction ,
1055
- "content" : content ,
1056
- "room_id" : room_id ,
1057
- "sender" : requester .user .to_string (),
1058
- "redacts" : event_id ,
1059
- },
1060
- txn_id = txn_id ,
1061
- )
1051
+ with_relations = None
1052
+ if self ._msc3912_enabled and "org.matrix.msc3912.with_relations" in content :
1053
+ with_relations = content ["org.matrix.msc3912.with_relations" ]
1054
+ del content ["org.matrix.msc3912.with_relations" ]
1055
+
1056
+ # Check if there's an existing event for this transaction now (even though
1057
+ # create_and_send_nonmember_event also does it) because, if there's one,
1058
+ # then we want to skip the call to redact_events_related_to.
1059
+ event = None
1060
+ if txn_id :
1061
+ event = await self .event_creation_handler .get_event_from_transaction (
1062
+ requester , txn_id , room_id
1063
+ )
1064
+
1065
+ if event is None :
1066
+ (
1067
+ event ,
1068
+ _ ,
1069
+ ) = await self .event_creation_handler .create_and_send_nonmember_event (
1070
+ requester ,
1071
+ {
1072
+ "type" : EventTypes .Redaction ,
1073
+ "content" : content ,
1074
+ "room_id" : room_id ,
1075
+ "sender" : requester .user .to_string (),
1076
+ "redacts" : event_id ,
1077
+ },
1078
+ txn_id = txn_id ,
1079
+ )
1080
+
1081
+ if with_relations :
1082
+ run_as_background_process (
1083
+ "redact_related_events" ,
1084
+ self ._relation_handler .redact_events_related_to ,
1085
+ requester = requester ,
1086
+ event_id = event_id ,
1087
+ initial_redaction_event = event ,
1088
+ relation_types = with_relations ,
1089
+ )
1090
+
1062
1091
event_id = event .event_id
1063
1092
except ShadowBanError :
1064
1093
event_id = "$" + random_string (43 )
0 commit comments