summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--synapse/storage/appservice.py50
-rw-r--r--synapse/storage/directory.py23
-rw-r--r--synapse/storage/room.py11
3 files changed, 82 insertions, 2 deletions
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.