|
53 | 53 | from synapse.storage.databases.main.cache import CacheInvalidationWorkerStore
|
54 | 54 | from synapse.storage.databases.main.events_worker import EventsWorkerStore
|
55 | 55 | from synapse.storage.engines import Sqlite3Engine
|
56 |
| -from synapse.storage.roommember import MemberSummary, ProfileInfo, RoomsForUser |
| 56 | +from synapse.storage.roommember import ( |
| 57 | + MemberSummary, |
| 58 | + ProfileInfo, |
| 59 | + RoomsForUser, |
| 60 | + RoomsForUserSlidingSync, |
| 61 | +) |
57 | 62 | from synapse.types import (
|
58 | 63 | JsonDict,
|
59 | 64 | PersistedEventPosition,
|
@@ -1377,6 +1382,54 @@ async def update_room_forgetter_stream_pos(self, stream_id: int) -> None:
|
1377 | 1382 | desc="room_forgetter_stream_pos",
|
1378 | 1383 | )
|
1379 | 1384 |
|
| 1385 | + @cached(iterable=True, max_entries=10000) |
| 1386 | + async def get_sliding_sync_rooms_for_user( |
| 1387 | + self, |
| 1388 | + user_id: str, |
| 1389 | + ) -> Mapping[str, RoomsForUserSlidingSync]: |
| 1390 | + """Get all the rooms for a user to handle a sliding sync request. |
| 1391 | +
|
| 1392 | + Ignores forgotten rooms and rooms that the user has been kicked from. |
| 1393 | +
|
| 1394 | + Returns: |
| 1395 | + Map from room ID to membership info |
| 1396 | + """ |
| 1397 | + |
| 1398 | + def get_sliding_sync_rooms_for_user_txn( |
| 1399 | + txn: LoggingTransaction, |
| 1400 | + ) -> Dict[str, RoomsForUserSlidingSync]: |
| 1401 | + sql = """ |
| 1402 | + SELECT m.room_id, m.sender, m.membership, m.membership_event_id, |
| 1403 | + r.room_version, |
| 1404 | + m.event_instance_name, m.event_stream_ordering, |
| 1405 | + COALESCE(j.room_type, m.room_type), |
| 1406 | + COALESCE(j.is_encrypted, m.is_encrypted) |
| 1407 | + FROM sliding_sync_membership_snapshots AS m |
| 1408 | + INNER JOIN rooms AS r USING (room_id) |
| 1409 | + LEFT JOIN sliding_sync_joined_rooms AS j ON (j.room_id = m.room_id AND m.membership = 'join') |
| 1410 | + WHERE user_id = ? |
| 1411 | + AND m.forgotten = 0 |
| 1412 | + """ |
| 1413 | + txn.execute(sql, (user_id,)) |
| 1414 | + return { |
| 1415 | + row[0]: RoomsForUserSlidingSync( |
| 1416 | + room_id=row[0], |
| 1417 | + sender=row[1], |
| 1418 | + membership=row[2], |
| 1419 | + event_id=row[3], |
| 1420 | + room_version_id=row[4], |
| 1421 | + event_pos=PersistedEventPosition(row[5], row[6]), |
| 1422 | + room_type=row[7], |
| 1423 | + is_encrypted=row[8], |
| 1424 | + ) |
| 1425 | + for row in txn |
| 1426 | + } |
| 1427 | + |
| 1428 | + return await self.db_pool.runInteraction( |
| 1429 | + "get_sliding_sync_rooms_for_user", |
| 1430 | + get_sliding_sync_rooms_for_user_txn, |
| 1431 | + ) |
| 1432 | + |
1380 | 1433 |
|
1381 | 1434 | class RoomMemberBackgroundUpdateStore(SQLBaseStore):
|
1382 | 1435 | def __init__(
|
|
0 commit comments