mirror of
https://github.com/element-hq/synapse
synced 2024-09-02 09:10:24 +00:00
Add support for extracting matching room_ids and room_aliases for a given AS.
This commit is contained in:
parent
2d20466f9a
commit
2b8ca84296
3 changed files with 82 additions and 2 deletions
|
@ -153,6 +153,19 @@ class ApplicationServiceStore(SQLBaseStore):
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_app_service_by_user_id(self, user_id):
|
def get_app_service_by_user_id(self, user_id):
|
||||||
|
"""Retrieve an application service from their user ID.
|
||||||
|
|
||||||
|
All application services have associated with them a particular user ID.
|
||||||
|
There is no distinguishing feature on the user ID which indicates it
|
||||||
|
represents an application service. This function allows you to map from
|
||||||
|
a user ID to an application service.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user_id(str): The user ID to see if it is an application service.
|
||||||
|
Returns:
|
||||||
|
synapse.appservice.ApplicationService or None.
|
||||||
|
"""
|
||||||
|
|
||||||
yield self.cache_defer # make sure the cache is ready
|
yield self.cache_defer # make sure the cache is ready
|
||||||
|
|
||||||
for service in self.services_cache:
|
for service in self.services_cache:
|
||||||
|
@ -163,7 +176,7 @@ class ApplicationServiceStore(SQLBaseStore):
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_app_service_by_token(self, token, from_cache=True):
|
def get_app_service_by_token(self, token, from_cache=True):
|
||||||
"""Get the application service with the given token.
|
"""Get the application service with the given appservice token.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
token (str): The application service token.
|
token (str): The application service token.
|
||||||
|
@ -186,10 +199,43 @@ class ApplicationServiceStore(SQLBaseStore):
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_app_service_rooms(self, service):
|
def get_app_service_rooms(self, service):
|
||||||
logger.info("get_app_service_rooms -> %s", service)
|
"""Get a list of RoomsForUser for this application service.
|
||||||
|
|
||||||
|
Application services may be "interested" in lots of rooms depending on
|
||||||
|
the room ID, the room aliases, or the members in the room. This function
|
||||||
|
takes all of these into account and returns a list of RoomsForUser which
|
||||||
|
represent the entire list of room IDs that this application service
|
||||||
|
wants to know about.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
service: The application service to get a room list for.
|
||||||
|
Returns:
|
||||||
|
A list of RoomsForUser.
|
||||||
|
"""
|
||||||
|
# FIXME: This is assuming that this store has methods from
|
||||||
|
# RoomStore, DirectoryStore, which is a bad assumption to
|
||||||
|
# make as it makes testing trickier and coupling less obvious.
|
||||||
|
|
||||||
|
# get all rooms matching the room ID regex.
|
||||||
|
room_entries = yield self.get_all_rooms() # RoomEntry list
|
||||||
|
matching_room_id_list = [
|
||||||
|
r.room_id for r in room_entries if
|
||||||
|
service.is_interested_in_room(r.room_id)
|
||||||
|
]
|
||||||
|
|
||||||
|
# resolve room IDs for matching room alias regex.
|
||||||
|
room_alias_mappings = yield self.get_all_associations()
|
||||||
|
matching_alias_list = [
|
||||||
|
r.room_id for r in room_alias_mappings if
|
||||||
|
service.is_interested_in_alias(r.room_alias)
|
||||||
|
]
|
||||||
|
|
||||||
|
# get all rooms for every user for this AS.
|
||||||
|
|
||||||
# TODO stub
|
# TODO stub
|
||||||
yield self.cache_defer
|
yield self.cache_defer
|
||||||
|
|
||||||
|
|
||||||
defer.returnValue([RoomsForUser("!foo:bar", service.sender, "join")])
|
defer.returnValue([RoomsForUser("!foo:bar", service.sender, "join")])
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
|
|
|
@ -134,6 +134,29 @@ class DirectoryStore(SQLBaseStore):
|
||||||
|
|
||||||
return room_id
|
return room_id
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def get_all_associations(self):
|
||||||
|
"""Retrieve the entire list of room alias -> room ID pairings.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A list of RoomAliasMappings.
|
||||||
|
"""
|
||||||
|
results = self._simple_select_list(
|
||||||
|
"room_aliases",
|
||||||
|
None,
|
||||||
|
["room_alias", "room_id"]
|
||||||
|
)
|
||||||
|
# TODO(kegan): It feels wrong to be specifying no servers here, but
|
||||||
|
# equally this function isn't required to obtain all servers so
|
||||||
|
# retrieving them "just for the sake of it" also seems wrong, but we
|
||||||
|
# want to conform to passing Objects around and not dicts..
|
||||||
|
return [
|
||||||
|
RoomAliasMapping(
|
||||||
|
room_id=r["room_id"], room_alias=r["room_alias"], servers=""
|
||||||
|
) for r in results
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def get_aliases_for_room(self, room_id):
|
def get_aliases_for_room(self, room_id):
|
||||||
return self._simple_select_onecol(
|
return self._simple_select_onecol(
|
||||||
"room_aliases",
|
"room_aliases",
|
||||||
|
|
|
@ -71,6 +71,17 @@ class RoomStore(SQLBaseStore):
|
||||||
RoomsTable.decode_single_result, query, room_id,
|
RoomsTable.decode_single_result, query, room_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def get_all_rooms(self):
|
||||||
|
"""Retrieve all the rooms.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A list of namedtuples containing the room information.
|
||||||
|
"""
|
||||||
|
query = RoomsTable.select_statement()
|
||||||
|
return self._execute(
|
||||||
|
RoomsTable.decode_results, query,
|
||||||
|
)
|
||||||
|
|
||||||
@defer.inlineCallbacks
|
@defer.inlineCallbacks
|
||||||
def get_rooms(self, is_public):
|
def get_rooms(self, is_public):
|
||||||
"""Retrieve a list of all public rooms.
|
"""Retrieve a list of all public rooms.
|
||||||
|
|
Loading…
Reference in a new issue