diff --git a/synapse/storage/appservice.py b/synapse/storage/appservice.py
index 435ccfd6fc..c8f0ce44f4 100644
--- a/synapse/storage/appservice.py
+++ b/synapse/storage/appservice.py
@@ -153,6 +153,19 @@ class ApplicationServiceStore(SQLBaseStore):
@defer.inlineCallbacks
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
for service in self.services_cache:
@@ -163,7 +176,7 @@ class ApplicationServiceStore(SQLBaseStore):
@defer.inlineCallbacks
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:
token (str): The application service token.
@@ -186,10 +199,43 @@ class ApplicationServiceStore(SQLBaseStore):
@defer.inlineCallbacks
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
yield self.cache_defer
+
+
defer.returnValue([RoomsForUser("!foo:bar", service.sender, "join")])
@defer.inlineCallbacks
diff --git a/synapse/storage/directory.py b/synapse/storage/directory.py
index 68b7d59693..e13b336934 100644
--- a/synapse/storage/directory.py
+++ b/synapse/storage/directory.py
@@ -134,6 +134,29 @@ class DirectoryStore(SQLBaseStore):
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):
return self._simple_select_onecol(
"room_aliases",
diff --git a/synapse/storage/room.py b/synapse/storage/room.py
index 750b17a45f..3a64693404 100644
--- a/synapse/storage/room.py
+++ b/synapse/storage/room.py
@@ -71,6 +71,17 @@ class RoomStore(SQLBaseStore):
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
def get_rooms(self, is_public):
"""Retrieve a list of all public rooms.
|