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

Combine duplicated code for calculating an event ID from a txn ID #16023

Merged
merged 2 commits into from
Jul 31, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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 @@ -876,14 +876,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 @@ -892,8 +891,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 @@ -907,7 +907,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 @@ -920,9 +920,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 @@ -174,8 +174,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 @@ -416,29 +414,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