summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--synapse/handlers/appservice.py25
-rw-r--r--synapse/storage/appservice.py52
2 files changed, 72 insertions, 5 deletions
diff --git a/synapse/handlers/appservice.py b/synapse/handlers/appservice.py
index 55a653476f..25e1cece56 100644
--- a/synapse/handlers/appservice.py
+++ b/synapse/handlers/appservice.py
@@ -42,8 +42,27 @@ class ApplicationServicesHandler(BaseHandler):
                 "Consult the home server admin."
             )
 
-        # update AS entry with base URL
-
-        # store namespaces for this AS
+        # store this AS
 
         defer.returnValue("not_implemented_yet")
+
+    def unregister(self, token):
+        yield self.store.unregister_app_service(token)
+
+    def notify_interested_services(self, event):
+        """Notifies (pushes) all application services interested in this event.
+
+        Pushing is done asynchronously, so this method won't block for any
+        prolonged length of time.
+
+        Args:
+            event(Event): The event to push out to interested services.
+        """
+        # TODO: Gather interested services
+        #         get_services_for_event(event) <-- room IDs and user IDs
+        #         Get a list of room aliases. Check regex.
+        # TODO: If unknown user: poke User Query API.
+        # TODO: If unknown room alias: poke Room Alias Query API.
+
+        # TODO: Fork off pushes to these services - XXX First cut, best effort
+        pass
diff --git a/synapse/storage/appservice.py b/synapse/storage/appservice.py
index 4c11191fe8..fbad17cb9e 100644
--- a/synapse/storage/appservice.py
+++ b/synapse/storage/appservice.py
@@ -84,16 +84,60 @@ class ApplicationServiceStore(SQLBaseStore):
         super(ApplicationServiceStore, self).__init__(hs)
         self.cache = ApplicationServiceCache()
         self.clock = hs.get_clock()
+        self._populate_cache()
+
+    def unregister_app_service(self, token):
+        """Unregisters this service.
+
+        This removes all AS specific regex and the base URL. The token is the
+        only thing preserved for future registration attempts.
+        """
+        # TODO: DELETE FROM application_services_regex WHERE id=this service
+        # TODO: SET url=NULL WHERE token=token
+        # TODO: Update cache
+        pass
+
+    def update_app_service(self, service):
+        """Update an application service, clobbering what was previously there.
+
+        Args:
+            service(ApplicationService): The updated service.
+        """
+        # NB: There is no "insert" since we provide no public-facing API to
+        # allocate new ASes. It relies on the server admin inserting the AS
+        # token into the database manually.
+
+        # TODO: UPDATE application_services, SET url WHERE token=service.token
+        # TODO: DELETE FROM application_services_regex WHERE id=this service
+        # TODO: INSERT INTO application_services_regex <new namespace regex>
+        # TODO: Update cache
+        pass
+
+    def get_services_for_event(self, event):
+        return self.cache.get_services_for_event(event)
 
     @defer.inlineCallbacks
-    def get_app_service(self, as_token):
+    def get_app_service(self, as_token, from_cache=True):
         """Get the application service with the given token.
 
         Args:
             token (str): The application service token.
+            from_cache (bool): True to get this service from the cache, False to
+                               check the database.
         Raises:
-            StoreError if there was a problem retrieving this.
+            StoreError if there was a problem retrieving this service.
         """
+
+        if from_cache:
+            for service in self.cache.services:
+                if service.token == as_token:
+                    defer.returnValue(service)
+                    return
+            defer.returnValue(None)
+            return
+
+
+        # TODO: This should be JOINed with the application_services_regex table.
         row = self._simple_select_one(
             "application_services", {"token": as_token},
             ["url", "token"]
@@ -101,3 +145,7 @@ class ApplicationServiceStore(SQLBaseStore):
         if not row:
             raise StoreError(400, "Bad application services token supplied.")
         defer.returnValue(row)
+
+    def _populate_cache(self):
+        """Populates the ApplicationServiceCache from the database."""
+        pass