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

Migrate direct message and tag state on room upgrade #4412

Merged
merged 23 commits into from
Jan 28, 2019
Merged
Changes from 8 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
75942af
Fix typo
anoadragon453 Jan 17, 2019
4ff6d22
Preserve DM status of a room on upgrade
anoadragon453 Jan 17, 2019
1f18c7c
Add changelog
anoadragon453 Jan 17, 2019
887ca93
Prevent crash on user who doesn't have any direct rooms
anoadragon453 Jan 17, 2019
ea8903f
Migrating dm and room tags work for migrator
anoadragon453 Jan 18, 2019
25d64a8
Fix typos
anoadragon453 Jan 18, 2019
8c85f08
tags, m.direct copying over correctly
anoadragon453 Jan 18, 2019
48951f4
Join logic covers both room creator and arbitrary users
anoadragon453 Jan 22, 2019
8086a5c
Fix comments
anoadragon453 Jan 22, 2019
c4875d8
Prevent duplicate room IDs in m.direct
anoadragon453 Jan 22, 2019
117bc94
Merge branch 'develop' of github.com:matrix-org/synapse into anoa/dm_…
anoadragon453 Jan 22, 2019
766a172
lint
anoadragon453 Jan 22, 2019
0862d35
Move tag and direct state copying into separate function
anoadragon453 Jan 25, 2019
821b65a
Merge branch 'develop' of github.com:matrix-org/synapse into anoa/dm_…
anoadragon453 Jan 25, 2019
6f3fda7
Move room_tag declaration to be closer to its use
anoadragon453 Jan 25, 2019
516456b
Remove unnecessary null check
anoadragon453 Jan 25, 2019
c4cdafa
Destructure account data tuple before use
anoadragon453 Jan 25, 2019
8265995
Use python magic
anoadragon453 Jan 25, 2019
da0d221
Clean up direct_rooms access
anoadragon453 Jan 25, 2019
9244a30
Fixes
anoadragon453 Jan 25, 2019
1ce4639
Reuse predecessor method
anoadragon453 Jan 28, 2019
4026d55
Merge branch 'develop' of github.com:matrix-org/synapse into anoa/dm_…
anoadragon453 Jan 28, 2019
f0e96ab
Change return syntax in doc string
anoadragon453 Jan 28, 2019
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
89 changes: 54 additions & 35 deletions synapse/handlers/room_member.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import synapse.types
from synapse.api.constants import EventTypes, Membership
from synapse.api.errors import AuthError, Codes, SynapseError
from synapse.storage.state import StateFilter
from synapse.types import RoomID, UserID
from synapse.util.async_helpers import Linearizer
from synapse.util.distributor import user_joined_room, user_left_room
Expand Down Expand Up @@ -223,49 +224,18 @@ def _local_membership_update(

# Copy over direct message status and room tags if this is a join
anoadragon453 marked this conversation as resolved.
Show resolved Hide resolved
# on an upgraded room

# Check if this is an upgraded room
state_ids = yield self.store.get_current_state_ids(room_id)
state_ids = yield self.store.get_filtered_current_state_ids(
room_id, StateFilter.from_types([(EventTypes.Create, "")]),
)
create_id = state_ids.get((EventTypes.Create, ""))
if not create_id:
return
create_event = yield self.store.get_event(create_id)

if "predecessor" in create_event["content"]:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

presumably we can use the method from the search PR for this

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, we can but it's inside SearchHandler:

def get_old_rooms_from_upgraded_room(self, room_id):
"""Retrieves room IDs of old rooms in the history of an upgraded room.
We do so by checking the m.room.create event of the room for a
`predecessor` key. If it exists, we add the room ID to our return
list and then check that room for a m.room.create event and so on
until we can no longer find any more previous rooms.
The full list of all found rooms in then returned.
Args:
room_id (str): id of the room to search through.
Returns:
Deferred[iterable[unicode]]: predecessor room ids
"""

Shall I move it to the store instead?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I was thinking specifically of get_room_predecessor, which is in the Store I think?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, so it is. Will add, thanks.

old_room_id = create_event["content"]["predecessor"]["room_id"]

# Retrieve room account data for predecessor room
user_account_data = yield self.store.get_account_data_for_user(
user_id,
)
room_tags = yield self.store.get_tags_for_room(
user_id, old_room_id,
)

# Copy direct message state if applicable
if user_account_data and "m.direct" in user_account_data[0]:
direct_rooms = user_account_data[0]["m.direct"]

# Check which key this room is under
for key, room_id_list in direct_rooms.items():
if old_room_id in room_id_list and room_id not in room_id_list:
# Add new room_id to this key
direct_rooms[key].append(room_id)

# Save back to user's m.direct account data
yield self.store.add_account_data_for_user(
user_id, "m.direct", direct_rooms,
)
break

# Copy room tags if applicable
if room_tags:
# Copy each room tag to the new room
for tag in room_tags.keys():
tag_content = room_tags[tag]
yield self.store.add_tag_to_room(
user_id, room_id, tag, tag_content
)
self.copy_room_tags_and_direct_to_room(old_room_id, room_id, user_id)
elif event.membership == Membership.LEAVE:
if prev_member_event_id:
prev_member_event = yield self.store.get_event(prev_member_event_id)
Expand All @@ -274,6 +244,55 @@ def _local_membership_update(

defer.returnValue(event)

@defer.inlineCallbacks
def copy_room_tags_and_direct_to_room(
self,
old_room_id,
new_room_id,
user_id,
):
"""Copies the tags and direct room state from one room to another.

Args:
old_room_id (str)
new_room_id (str)
user_id (str)

Returns:
Deferred|None
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ITYM Deferred[None] ?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, it was just copied from another method. We seem to have several different ways of writing the same thing spread across different methods?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deferred|None means: "either a Deferred (of unspecified value type), or None", which is different to what your method does

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ahh, I see, thank you.

"""
# Retrieve user account data for predecessor room
user_account_data, _ = yield self.store.get_account_data_for_user(
user_id,
)

# Copy direct message state if applicable
direct_rooms = user_account_data.get("m.direct", {})

# Check which key this room is under
if isinstance(direct_rooms, dict):
for key, room_id_list in direct_rooms.items():
if old_room_id in room_id_list and new_room_id not in room_id_list:
# Add new room_id to this key
direct_rooms[key].append(new_room_id)

# Save back to user's m.direct account data
yield self.store.add_account_data_for_user(
user_id, "m.direct", direct_rooms,
)
break

# Copy room tags if applicable
room_tags = yield self.store.get_tags_for_room(
user_id, old_room_id,
)

# Copy each room tag to the new room
for tag, tag_content in room_tags.items():
yield self.store.add_tag_to_room(
user_id, new_room_id, tag, tag_content
)

@defer.inlineCallbacks
def update_membership(
self,
Expand Down