Add support for extracting matching room_ids and room_aliases for a given AS.

This commit is contained in:
Kegan Dougal 2015-02-25 17:15:25 +00:00
parent 2d20466f9a
commit 2b8ca84296
3 changed files with 82 additions and 2 deletions

View File

@ -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

View File

@ -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",

View File

@ -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.