Skip to content
This repository was archived by the owner on Apr 26, 2024. It is now read-only.

Commit 1d5c80b

Browse files
authored
Reduce duplicate code in receipts servlets. (#13198)
1 parent 3371e1a commit 1d5c80b

File tree

3 files changed

+33
-44
lines changed

3 files changed

+33
-44
lines changed

changelog.d/13198.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Refactor receipts servlet logic to avoid duplicated code.

synapse/rest/client/read_marker.py

Lines changed: 24 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ def __init__(self, hs: "HomeServer"):
4040
self.read_marker_handler = hs.get_read_marker_handler()
4141
self.presence_handler = hs.get_presence_handler()
4242

43+
self._known_receipt_types = {ReceiptTypes.READ, ReceiptTypes.FULLY_READ}
44+
if hs.config.experimental.msc2285_enabled:
45+
self._known_receipt_types.add(ReceiptTypes.READ_PRIVATE)
46+
4347
async def on_POST(
4448
self, request: SynapseRequest, room_id: str
4549
) -> Tuple[int, JsonDict]:
@@ -49,13 +53,7 @@ async def on_POST(
4953

5054
body = parse_json_object_from_request(request)
5155

52-
valid_receipt_types = {
53-
ReceiptTypes.READ,
54-
ReceiptTypes.FULLY_READ,
55-
ReceiptTypes.READ_PRIVATE,
56-
}
57-
58-
unrecognized_types = set(body.keys()) - valid_receipt_types
56+
unrecognized_types = set(body.keys()) - self._known_receipt_types
5957
if unrecognized_types:
6058
# It's fine if there are unrecognized receipt types, but let's log
6159
# it to help debug clients that have typoed the receipt type.
@@ -65,31 +63,25 @@ async def on_POST(
6563
# types.
6664
logger.info("Ignoring unrecognized receipt types: %s", unrecognized_types)
6765

68-
read_event_id = body.get(ReceiptTypes.READ, None)
69-
if read_event_id:
70-
await self.receipts_handler.received_client_receipt(
71-
room_id,
72-
ReceiptTypes.READ,
73-
user_id=requester.user.to_string(),
74-
event_id=read_event_id,
75-
)
76-
77-
read_private_event_id = body.get(ReceiptTypes.READ_PRIVATE, None)
78-
if read_private_event_id and self.config.experimental.msc2285_enabled:
79-
await self.receipts_handler.received_client_receipt(
80-
room_id,
81-
ReceiptTypes.READ_PRIVATE,
82-
user_id=requester.user.to_string(),
83-
event_id=read_private_event_id,
84-
)
85-
86-
read_marker_event_id = body.get(ReceiptTypes.FULLY_READ, None)
87-
if read_marker_event_id:
88-
await self.read_marker_handler.received_client_read_marker(
89-
room_id,
90-
user_id=requester.user.to_string(),
91-
event_id=read_marker_event_id,
92-
)
66+
for receipt_type in self._known_receipt_types:
67+
event_id = body.get(receipt_type, None)
68+
# TODO Add validation to reject non-string event IDs.
69+
if not event_id:
70+
continue
71+
72+
if receipt_type == ReceiptTypes.FULLY_READ:
73+
await self.read_marker_handler.received_client_read_marker(
74+
room_id,
75+
user_id=requester.user.to_string(),
76+
event_id=event_id,
77+
)
78+
else:
79+
await self.receipts_handler.received_client_receipt(
80+
room_id,
81+
receipt_type,
82+
user_id=requester.user.to_string(),
83+
event_id=event_id,
84+
)
9385

9486
return 200, {}
9587

synapse/rest/client/receipts.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,31 +39,27 @@ class ReceiptRestServlet(RestServlet):
3939

4040
def __init__(self, hs: "HomeServer"):
4141
super().__init__()
42-
self.hs = hs
4342
self.auth = hs.get_auth()
4443
self.receipts_handler = hs.get_receipts_handler()
4544
self.read_marker_handler = hs.get_read_marker_handler()
4645
self.presence_handler = hs.get_presence_handler()
4746

47+
self._known_receipt_types = {ReceiptTypes.READ}
48+
if hs.config.experimental.msc2285_enabled:
49+
self._known_receipt_types.update(
50+
(ReceiptTypes.READ_PRIVATE, ReceiptTypes.FULLY_READ)
51+
)
52+
4853
async def on_POST(
4954
self, request: SynapseRequest, room_id: str, receipt_type: str, event_id: str
5055
) -> Tuple[int, JsonDict]:
5156
requester = await self.auth.get_user_by_req(request)
5257

53-
if self.hs.config.experimental.msc2285_enabled and receipt_type not in [
54-
ReceiptTypes.READ,
55-
ReceiptTypes.READ_PRIVATE,
56-
ReceiptTypes.FULLY_READ,
57-
]:
58+
if receipt_type not in self._known_receipt_types:
5859
raise SynapseError(
5960
400,
60-
"Receipt type must be 'm.read', 'org.matrix.msc2285.read.private' or 'm.fully_read'",
61+
f"Receipt type must be {', '.join(self._known_receipt_types)}",
6162
)
62-
elif (
63-
not self.hs.config.experimental.msc2285_enabled
64-
and receipt_type != ReceiptTypes.READ
65-
):
66-
raise SynapseError(400, "Receipt type must be 'm.read'")
6763

6864
parse_json_object_from_request(request, allow_empty_body=False)
6965

0 commit comments

Comments
 (0)