Add forward extremities endpoint to rooms admin API
GET /_synapse/admin/v1/rooms/<identifier>/forward_extremities now gets forward extremities for a room, returning count and the list of extremities. Signed-off-by: Jason Robinson <jasonr@matrix.org>
This commit is contained in:
parent
b530eaa262
commit
b849e46139
|
@ -36,6 +36,7 @@ from synapse.rest.admin.media import ListMediaInRoom, register_servlets_for_medi
|
||||||
from synapse.rest.admin.purge_room_servlet import PurgeRoomServlet
|
from synapse.rest.admin.purge_room_servlet import PurgeRoomServlet
|
||||||
from synapse.rest.admin.rooms import (
|
from synapse.rest.admin.rooms import (
|
||||||
DeleteRoomRestServlet,
|
DeleteRoomRestServlet,
|
||||||
|
ForwardExtremitiesRestServlet,
|
||||||
JoinRoomAliasServlet,
|
JoinRoomAliasServlet,
|
||||||
ListRoomRestServlet,
|
ListRoomRestServlet,
|
||||||
MakeRoomAdminRestServlet,
|
MakeRoomAdminRestServlet,
|
||||||
|
@ -230,6 +231,7 @@ def register_servlets(hs, http_server):
|
||||||
EventReportsRestServlet(hs).register(http_server)
|
EventReportsRestServlet(hs).register(http_server)
|
||||||
PushersRestServlet(hs).register(http_server)
|
PushersRestServlet(hs).register(http_server)
|
||||||
MakeRoomAdminRestServlet(hs).register(http_server)
|
MakeRoomAdminRestServlet(hs).register(http_server)
|
||||||
|
ForwardExtremitiesRestServlet(hs).register(http_server)
|
||||||
|
|
||||||
|
|
||||||
def register_servlets_for_client_rest_resource(hs, http_server):
|
def register_servlets_for_client_rest_resource(hs, http_server):
|
||||||
|
|
|
@ -499,3 +499,56 @@ class MakeRoomAdminRestServlet(RestServlet):
|
||||||
)
|
)
|
||||||
|
|
||||||
return 200, {}
|
return 200, {}
|
||||||
|
|
||||||
|
|
||||||
|
class ForwardExtremitiesRestServlet(RestServlet):
|
||||||
|
"""Allows a server admin to get or clear forward extremities.
|
||||||
|
|
||||||
|
Clearing does not require restarting the server.
|
||||||
|
|
||||||
|
Clear forward extremities:
|
||||||
|
DELETE /_synapse/admin/v1/rooms/<room_id_or_alias>/forward_extremities
|
||||||
|
|
||||||
|
Get forward_extremities:
|
||||||
|
GET /_synapse/admin/v1/rooms/<room_id_or_alias>/forward_extremities
|
||||||
|
"""
|
||||||
|
|
||||||
|
PATTERNS = admin_patterns("/rooms/(?P<room_identifier>[^/]*)/forward_extremities")
|
||||||
|
|
||||||
|
def __init__(self, hs: "HomeServer"):
|
||||||
|
self.hs = hs
|
||||||
|
self.auth = hs.get_auth()
|
||||||
|
self.room_member_handler = hs.get_room_member_handler()
|
||||||
|
self.store = hs.get_datastore()
|
||||||
|
|
||||||
|
async def resolve_room_id(self, room_identifier: str) -> str:
|
||||||
|
"""Resolve to a room ID, if necessary."""
|
||||||
|
if RoomID.is_valid(room_identifier):
|
||||||
|
return room_identifier
|
||||||
|
elif RoomAlias.is_valid(room_identifier):
|
||||||
|
room_alias = RoomAlias.from_string(room_identifier)
|
||||||
|
room_id, _ = await self.room_member_handler.lookup_room_alias(room_alias)
|
||||||
|
return room_id.to_string()
|
||||||
|
raise SynapseError(
|
||||||
|
400, "%s was not legal room ID or room alias" % (room_identifier,)
|
||||||
|
)
|
||||||
|
|
||||||
|
async def on_DELETE(self, request, room_identifier):
|
||||||
|
requester = await self.auth.get_user_by_req(request)
|
||||||
|
await assert_user_is_admin(self.auth, requester.user)
|
||||||
|
|
||||||
|
room_id = await self.resolve_room_id(room_identifier)
|
||||||
|
|
||||||
|
async def on_GET(self, request, room_identifier):
|
||||||
|
requester = await self.auth.get_user_by_req(request)
|
||||||
|
await assert_user_is_admin(self.auth, requester.user)
|
||||||
|
|
||||||
|
room_id = await self.resolve_room_id(room_identifier)
|
||||||
|
if not room_id:
|
||||||
|
raise SynapseError(400, "Unknown room ID or room alias %s" % room_identifier)
|
||||||
|
|
||||||
|
extremities = await self.store.get_forward_extremities_for_room(room_id)
|
||||||
|
return 200, {
|
||||||
|
"count": len(extremities),
|
||||||
|
"results": extremities,
|
||||||
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@ from .end_to_end_keys import EndToEndKeyStore
|
||||||
from .event_federation import EventFederationStore
|
from .event_federation import EventFederationStore
|
||||||
from .event_push_actions import EventPushActionsStore
|
from .event_push_actions import EventPushActionsStore
|
||||||
from .events_bg_updates import EventsBackgroundUpdatesStore
|
from .events_bg_updates import EventsBackgroundUpdatesStore
|
||||||
|
from .events_forward_extremities import EventForwardExtremitiesStore
|
||||||
from .filtering import FilteringStore
|
from .filtering import FilteringStore
|
||||||
from .group_server import GroupServerStore
|
from .group_server import GroupServerStore
|
||||||
from .keys import KeyStore
|
from .keys import KeyStore
|
||||||
|
@ -118,6 +119,7 @@ class DataStore(
|
||||||
UIAuthStore,
|
UIAuthStore,
|
||||||
CacheInvalidationWorkerStore,
|
CacheInvalidationWorkerStore,
|
||||||
ServerMetricsStore,
|
ServerMetricsStore,
|
||||||
|
EventForwardExtremitiesStore,
|
||||||
):
|
):
|
||||||
def __init__(self, database: DatabasePool, db_conn, hs):
|
def __init__(self, database: DatabasePool, db_conn, hs):
|
||||||
self.hs = hs
|
self.hs = hs
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
from typing import List, Dict
|
||||||
|
|
||||||
|
from synapse.storage._base import SQLBaseStore
|
||||||
|
|
||||||
|
|
||||||
|
class EventForwardExtremitiesStore(SQLBaseStore):
|
||||||
|
async def get_forward_extremities_for_room(self, room_id: str) -> List[Dict]:
|
||||||
|
def get_forward_extremities_for_room_txn(txn):
|
||||||
|
sql = (
|
||||||
|
"SELECT event_id, state_group FROM event_forward_extremities NATURAL JOIN event_to_state_groups "
|
||||||
|
"WHERE room_id = ?"
|
||||||
|
)
|
||||||
|
|
||||||
|
txn.execute(sql, (room_id,))
|
||||||
|
rows = txn.fetchall()
|
||||||
|
return [{"event_id": row[0], "state_group": row[1]} for row in rows]
|
||||||
|
|
||||||
|
return await self.db_pool.runInteraction(
|
||||||
|
"get_forward_extremities_for_room", get_forward_extremities_for_room_txn
|
||||||
|
)
|
Loading…
Reference in New Issue