diff options
author | Patrick Cloke <patrickc@matrix.org> | 2022-07-25 15:01:06 -0400 |
---|---|---|
committer | Patrick Cloke <patrickc@matrix.org> | 2022-07-27 11:46:22 -0400 |
commit | e9a649ec314122d34d1b408c83800e1f1e263554 (patch) | |
tree | d29cd47c03635234d7140189cb4ddcda527a4406 /synapse/rest | |
parent | Implement MSC3848: Introduce errcodes for specific event sending failures (#1... (diff) | |
download | synapse-e9a649ec314122d34d1b408c83800e1f1e263554.tar.xz |
Add an API for listing threads in a room.
Diffstat (limited to 'synapse/rest')
-rw-r--r-- | synapse/rest/client/relations.py | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/synapse/rest/client/relations.py b/synapse/rest/client/relations.py index ce97080013..faa962e3a8 100644 --- a/synapse/rest/client/relations.py +++ b/synapse/rest/client/relations.py @@ -13,6 +13,7 @@ # limitations under the License. import logging +import re from typing import TYPE_CHECKING, Optional, Tuple from synapse.http.server import HttpServer @@ -91,5 +92,48 @@ class RelationPaginationServlet(RestServlet): return 200, result +class ThreadsServlet(RestServlet): + PATTERNS = ( + re.compile( + "^/_matrix/client/unstable/org.matrix.msc3856/rooms/(?P<room_id>[^/]*)/threads" + ), + ) + + def __init__(self, hs: "HomeServer"): + super().__init__() + self.auth = hs.get_auth() + self.store = hs.get_datastores().main + self._relations_handler = hs.get_relations_handler() + + async def on_GET( + self, request: SynapseRequest, room_id: str + ) -> Tuple[int, JsonDict]: + requester = await self.auth.get_user_by_req(request) + + limit = parse_integer(request, "limit", default=5) + from_token_str = parse_string(request, "from") + to_token_str = parse_string(request, "to") + + # Return the relations + from_token = None + if from_token_str: + from_token = await StreamToken.from_string(self.store, from_token_str) + to_token = None + if to_token_str: + to_token = await StreamToken.from_string(self.store, to_token_str) + + result = await self._relations_handler.get_threads( + requester=requester, + room_id=room_id, + limit=limit, + from_token=from_token, + to_token=to_token, + ) + + return 200, result + + def register_servlets(hs: "HomeServer", http_server: HttpServer) -> None: RelationPaginationServlet(hs).register(http_server) + if hs.config.experimental.msc3856_enabled: + ThreadsServlet(hs).register(http_server) |