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

Commit 91b1b36

Browse files
erikjohnstonMadLittleMods
authored andcommitted
Add endpoint to get an event at a given timestamp
1 parent 0ae95b3 commit 91b1b36

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

synapse/rest/client/v1/room.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,30 @@ def register_txn_path(servlet, regex_string, http_server, with_get=False):
13831383
servlet.__class__.__name__,
13841384
)
13851385

1386+
class TimestampLookupRestServlet(ClientV1RestServlet):
1387+
PATTERNS = client_path_patterns("/rooms/(?P<room_id>[^/]*)/timestamp_to_event$")
1388+
1389+
def __init__(self, hs):
1390+
super(TimestampLookupRestServlet, self).__init__(hs)
1391+
self.store = hs.get_datastore()
1392+
1393+
@defer.inlineCallbacks
1394+
def on_GET(self, request, room_id):
1395+
requester = yield self.auth.get_user_by_req(request)
1396+
yield self.auth.check_joined_room(room_id, requester..to_string())
1397+
1398+
timestamp = parse_integer(request, "ts")
1399+
thread_id = parse_integer(request, "thread_id", 0)
1400+
1401+
event_id = yield self.store.get_event_for_timestamp(
1402+
room_id, thread_id, timestamp,
1403+
)
1404+
1405+
.returnValue((200, {
1406+
"event_id": event_id,
1407+
}))
1408+
1409+
13861410

13871411
class RoomSpaceSummaryRestServlet(RestServlet):
13881412
PATTERNS = (
@@ -1458,6 +1482,7 @@ def register_servlets(hs: "HomeServer", http_server, is_worker=False):
14581482
JoinedRoomsRestServlet(hs).register(http_server)
14591483
RoomAliasListServlet(hs).register(http_server)
14601484
SearchRestServlet(hs).register(http_server)
1485+
TimestampLookupRestServlet(hs).register(http_server)
14611486

14621487
# Some servlets only get registered for the main process.
14631488
if not is_worker:

synapse/storage/databases/main/events_worker.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,3 +1511,43 @@ def _cleanup_old_transaction_ids_txn(txn):
15111511
"_cleanup_old_transaction_ids",
15121512
_cleanup_old_transaction_ids_txn,
15131513
)
1514+
1515+
def get_event_for_timestamp(self, room_id, thread_id, timestamp):
1516+
sql_template = """
1517+
SELECT event_id, origin_server_ts FROM
1518+
WHERE
1519+
origin_server_ts %s ?
1520+
AND room_id = ?
1521+
AND thread_id = ?
1522+
ORDER BY origin_server_ts
1523+
LIMIT 1;
1524+
"""
1525+
1526+
def f(txn):
1527+
txn.execute(sql_template % ("<=",), (timestamp, room_id, thread_id))
1528+
row = txn.fetchone()
1529+
if row:
1530+
event_id_before, ts_before = row
1531+
else:
1532+
event_id_before, ts_before = None, None
1533+
1534+
txn.execute(sql_template % (">=",), (timestamp, room_id, thread_id))
1535+
row = txn.fetchone()
1536+
if row:
1537+
event_id_after, ts_after = row
1538+
else:
1539+
event_id_after, ts_after = None, None
1540+
1541+
if event_id_before and event_id_after:
1542+
# Return the closest
1543+
if (timestamp - ts_before) < (ts_after - timestamp):
1544+
return event_id_before
1545+
else:
1546+
return event_id_after
1547+
1548+
if event_id_before:
1549+
return event_id_before
1550+
1551+
return event_id_after
1552+
1553+
return self.runInteraction("get_event_for_timestamp", f)

0 commit comments

Comments
 (0)