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

Commit ab7dd39

Browse files
erikjohnstonMadLittleMods
authored andcommitted
Add endpoint to get an event at a given timestamp
1 parent 53f1c4d commit ab7dd39

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
@@ -980,6 +980,30 @@ def register_txn_path(servlet, regex_string, http_server, with_get=False):
980980
servlet.__class__.__name__,
981981
)
982982

983+
class TimestampLookupRestServlet(ClientV1RestServlet):
984+
PATTERNS = client_path_patterns("/rooms/(?P<room_id>[^/]*)/timestamp_to_event$")
985+
986+
def __init__(self, hs):
987+
super(TimestampLookupRestServlet, self).__init__(hs)
988+
self.store = hs.get_datastore()
989+
990+
@defer.inlineCallbacks
991+
def on_GET(self, request, room_id):
992+
requester = yield self.auth.get_user_by_req(request)
993+
yield self.auth.check_joined_room(room_id, requester..to_string())
994+
995+
timestamp = parse_integer(request, "ts")
996+
thread_id = parse_integer(request, "thread_id", 0)
997+
998+
event_id = yield self.store.get_event_for_timestamp(
999+
room_id, thread_id, timestamp,
1000+
)
1001+
1002+
.returnValue((200, {
1003+
"event_id": event_id,
1004+
}))
1005+
1006+
9831007

9841008
def register_servlets(hs, http_server, is_worker=False):
9851009
RoomStateEventRestServlet(hs).register(http_server)
@@ -994,6 +1018,7 @@ def register_servlets(hs, http_server, is_worker=False):
9941018
RoomRedactEventRestServlet(hs).register(http_server)
9951019
RoomTypingRestServlet(hs).register(http_server)
9961020
RoomEventContextServlet(hs).register(http_server)
1021+
TimestampLookupRestServlet(hs).register(http_server)
9971022

9981023
# Some servlets only get registered for the main process.
9991024
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
@@ -1444,3 +1444,43 @@ def _cleanup_old_transaction_ids_txn(txn):
14441444
"_cleanup_old_transaction_ids",
14451445
_cleanup_old_transaction_ids_txn,
14461446
)
1447+
1448+
def get_event_for_timestamp(self, room_id, thread_id, timestamp):
1449+
sql_template = """
1450+
SELECT event_id, origin_server_ts FROM
1451+
WHERE
1452+
origin_server_ts %s ?
1453+
AND room_id = ?
1454+
AND thread_id = ?
1455+
ORDER BY origin_server_ts
1456+
LIMIT 1;
1457+
"""
1458+
1459+
def f(txn):
1460+
txn.execute(sql_template % ("<=",), (timestamp, room_id, thread_id))
1461+
row = txn.fetchone()
1462+
if row:
1463+
event_id_before, ts_before = row
1464+
else:
1465+
event_id_before, ts_before = None, None
1466+
1467+
txn.execute(sql_template % (">=",), (timestamp, room_id, thread_id))
1468+
row = txn.fetchone()
1469+
if row:
1470+
event_id_after, ts_after = row
1471+
else:
1472+
event_id_after, ts_after = None, None
1473+
1474+
if event_id_before and event_id_after:
1475+
# Return the closest
1476+
if (timestamp - ts_before) < (ts_after - timestamp):
1477+
return event_id_before
1478+
else:
1479+
return event_id_after
1480+
1481+
if event_id_before:
1482+
return event_id_before
1483+
1484+
return event_id_after
1485+
1486+
return self.runInteraction("get_event_for_timestamp", f)

0 commit comments

Comments
 (0)