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

Commit

Permalink
Combine duplicated code for calculating an event ID from a txn ID (#1…
Browse files Browse the repository at this point in the history
…6023)

Refactoring related to stabilization of MSC3970, refactor to combine
code which has the same logic.
  • Loading branch information
clokep committed Jul 31, 2023
1 parent 1fb5a7a commit b7695ac
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 32 deletions.
1 change: 1 addition & 0 deletions changelog.d/16023.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Combine duplicated code.
39 changes: 31 additions & 8 deletions synapse/handlers/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -878,14 +878,13 @@ async def deduplicate_state_event(
return prev_event
return None

async def get_event_from_transaction(
async def get_event_id_from_transaction(
self,
requester: Requester,
txn_id: str,
room_id: str,
) -> Optional[EventBase]:
"""For the given transaction ID and room ID, check if there is a matching event.
If so, fetch it and return it.
) -> Optional[str]:
"""For the given transaction ID and room ID, check if there is a matching event ID.
Args:
requester: The requester making the request in the context of which we want
Expand All @@ -894,8 +893,9 @@ async def get_event_from_transaction(
room_id: The room ID.
Returns:
An event if one could be found, None otherwise.
An event ID if one could be found, None otherwise.
"""
existing_event_id = None

if self._msc3970_enabled and requester.device_id:
# When MSC3970 is enabled, we lookup for events sent by the same device first,
Expand All @@ -909,7 +909,7 @@ async def get_event_from_transaction(
)
)
if existing_event_id:
return await self.store.get_event(existing_event_id)
return existing_event_id

# Pre-MSC3970, we looked up for events that were sent by the same session by
# using the access token ID.
Expand All @@ -922,9 +922,32 @@ async def get_event_from_transaction(
txn_id,
)
)
if existing_event_id:
return await self.store.get_event(existing_event_id)

return existing_event_id

async def get_event_from_transaction(
self,
requester: Requester,
txn_id: str,
room_id: str,
) -> Optional[EventBase]:
"""For the given transaction ID and room ID, check if there is a matching event.
If so, fetch it and return it.
Args:
requester: The requester making the request in the context of which we want
to fetch the event.
txn_id: The transaction ID.
room_id: The room ID.
Returns:
An event if one could be found, None otherwise.
"""
existing_event_id = await self.get_event_id_from_transaction(
requester, txn_id, room_id
)
if existing_event_id:
return await self.store.get_event(existing_event_id)
return None

async def create_and_send_nonmember_event(
Expand Down
28 changes: 4 additions & 24 deletions synapse/handlers/room_member.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,8 +176,6 @@ def __init__(self, hs: "HomeServer"):
self.request_ratelimiter = hs.get_request_ratelimiter()
hs.get_notifier().add_new_join_in_room_callback(self._on_user_joined_room)

self._msc3970_enabled = hs.config.experimental.msc3970_enabled

def _on_user_joined_room(self, event_id: str, room_id: str) -> None:
"""Notify the rate limiter that a room join has occurred.
Expand Down Expand Up @@ -418,29 +416,11 @@ async def _local_membership_update(
# do this check just before we persist an event as well, but may as well
# do it up front for efficiency.)
if txn_id:
existing_event_id = None
if self._msc3970_enabled and requester.device_id:
# When MSC3970 is enabled, we lookup for events sent by the same device
# first, and fallback to the old behaviour if none were found.
existing_event_id = (
await self.store.get_event_id_from_transaction_id_and_device_id(
room_id,
requester.user.to_string(),
requester.device_id,
txn_id,
)
existing_event_id = (
await self.event_creation_handler.get_event_id_from_transaction(
requester, txn_id, room_id
)

if requester.access_token_id and not existing_event_id:
existing_event_id = (
await self.store.get_event_id_from_transaction_id_and_token_id(
room_id,
requester.user.to_string(),
requester.access_token_id,
txn_id,
)
)

)
if existing_event_id:
event_pos = await self.store.get_position_for_event(existing_event_id)
return existing_event_id, event_pos.stream
Expand Down

0 comments on commit b7695ac

Please sign in to comment.