Fixes https://github.com/matrix-org/synapse/issues/12383pull/14574/head
parent
9af2be192a
commit
f6c74d1cb2
|
@ -0,0 +1 @@
|
|||
Fix #12383: paginate room messages from the start if no from is given. Contributed by @gnunicorn .
|
|
@ -448,6 +448,12 @@ class PaginationHandler:
|
|||
|
||||
if pagin_config.from_token:
|
||||
from_token = pagin_config.from_token
|
||||
elif pagin_config.direction == "f":
|
||||
from_token = (
|
||||
await self.hs.get_event_sources().get_start_token_for_pagination(
|
||||
room_id
|
||||
)
|
||||
)
|
||||
else:
|
||||
from_token = (
|
||||
await self.hs.get_event_sources().get_current_token_for_pagination(
|
||||
|
|
|
@ -73,6 +73,19 @@ class EventSources:
|
|||
)
|
||||
return token
|
||||
|
||||
@trace
|
||||
async def get_start_token_for_pagination(self, room_id: str) -> StreamToken:
|
||||
"""Get the start token for a given room to be used to paginate
|
||||
events.
|
||||
|
||||
The returned token does not have the current values for fields other
|
||||
than `room`, since they are not used during pagination.
|
||||
|
||||
Returns:
|
||||
The start token for pagination.
|
||||
"""
|
||||
return StreamToken.START
|
||||
|
||||
@trace
|
||||
async def get_current_token_for_pagination(self, room_id: str) -> StreamToken:
|
||||
"""Get the current token for a given room to be used to paginate
|
||||
|
|
|
@ -1857,6 +1857,46 @@ class RoomMessagesTestCase(unittest.HomeserverTestCase):
|
|||
self.assertIn("chunk", channel.json_body)
|
||||
self.assertIn("end", channel.json_body)
|
||||
|
||||
def test_room_messages_backward(self) -> None:
|
||||
"""Test room messages can be retrieved by an admin that isn't in the room."""
|
||||
latest_event_id = self.helper.send(
|
||||
self.room_id, body="message 1", tok=self.user_tok
|
||||
)["event_id"]
|
||||
|
||||
# Check that we get the first and second message when querying /messages.
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
"/_synapse/admin/v1/rooms/%s/messages?dir=b" % (self.room_id,),
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
self.assertEqual(channel.code, 200, channel.json_body)
|
||||
|
||||
chunk = channel.json_body["chunk"]
|
||||
self.assertEqual(len(chunk), 6, [event["content"] for event in chunk])
|
||||
|
||||
# in backwards, this is the first event
|
||||
self.assertEqual(chunk[0]["event_id"], latest_event_id)
|
||||
|
||||
def test_room_messages_forward(self) -> None:
|
||||
"""Test room messages can be retrieved by an admin that isn't in the room."""
|
||||
latest_event_id = self.helper.send(
|
||||
self.room_id, body="message 1", tok=self.user_tok
|
||||
)["event_id"]
|
||||
|
||||
# Check that we get the first and second message when querying /messages.
|
||||
channel = self.make_request(
|
||||
"GET",
|
||||
"/_synapse/admin/v1/rooms/%s/messages?dir=f" % (self.room_id,),
|
||||
access_token=self.admin_user_tok,
|
||||
)
|
||||
self.assertEqual(channel.code, 200, channel.json_body)
|
||||
|
||||
chunk = channel.json_body["chunk"]
|
||||
self.assertEqual(len(chunk), 6, [event["content"] for event in chunk])
|
||||
|
||||
# in forward, this is the last event
|
||||
self.assertEqual(chunk[5]["event_id"], latest_event_id)
|
||||
|
||||
def test_room_messages_purge(self) -> None:
|
||||
"""Test room messages can be retrieved by an admin that isn't in the room."""
|
||||
store = self.hs.get_datastores().main
|
||||
|
|
Loading…
Reference in New Issue