summary refs log tree commit diff
path: root/synapse/rest/room.py
diff options
context:
space:
mode:
authorKegan Dougal <kegan@matrix.org>2014-08-22 15:59:15 +0100
committerKegan Dougal <kegan@matrix.org>2014-08-22 15:59:15 +0100
commitf690b7b8279551b5cab782e2e4cd5811fc9d3789 (patch)
tree1963927a804cd2acaf9c82620f09dc26fc88807e /synapse/rest/room.py
parentUpdater command line client to new IS API (diff)
downloadsynapse-f690b7b8279551b5cab782e2e4cd5811fc9d3789.tar.xz
Impl: /rooms/roomid/state/eventtype/state_key - Renamed RoomTopicRestServlet to RoomStateEventRestServlet. Support generic state event sending.
Diffstat (limited to 'synapse/rest/room.py')
-rw-r--r--synapse/rest/room.py47
1 files changed, 35 insertions, 12 deletions
diff --git a/synapse/rest/room.py b/synapse/rest/room.py
index f5b547b963..9752469863 100644
--- a/synapse/rest/room.py
+++ b/synapse/rest/room.py
@@ -95,39 +95,62 @@ class RoomCreateRestServlet(RestServlet):
         return (200, {})
 
 
-class RoomTopicRestServlet(RestServlet):
-    PATTERN = client_path_pattern("/rooms/(?P<room_id>[^/]*)/topic$")
+class RoomStateEventRestServlet(RestServlet):
+    def register(self, http_server):
+        # /room/$roomid/state/$eventtype
+        no_state_key = "/rooms/(?P<room_id>[^/]*)/state/(?P<event_type>[^/]*)$"
 
-    def get_event_type(self):
-        return RoomTopicEvent.TYPE
+        # /room/$roomid/state/$eventtype/$statekey
+        state_key = ("/rooms/(?P<room_id>[^/]*)/state/" +
+            "(?P<event_type>[^/]*)/(?P<state_key>[^/]*)$")
+
+        http_server.register_path("GET",
+                                  client_path_pattern(state_key),
+                                  self.on_GET)
+        http_server.register_path("PUT",
+                                  client_path_pattern(state_key),
+                                  self.on_PUT)
+        http_server.register_path("GET",
+                                  client_path_pattern(no_state_key),
+                                  self.on_GET_no_state_key)
+        http_server.register_path("PUT",
+                                  client_path_pattern(no_state_key),
+                                  self.on_PUT_no_state_key)
+
+    def on_GET_no_state_key(self, request, room_id, event_type):
+        return self.on_GET(request, room_id, event_type, "")
+
+    def on_PUT_no_state_key(self, request, room_id, event_type):
+        return self.on_PUT(request, room_id, event_type, "")
 
     @defer.inlineCallbacks
-    def on_GET(self, request, room_id):
+    def on_GET(self, request, room_id, event_type, state_key):
         user = yield self.auth.get_user_by_req(request)
 
         msg_handler = self.handlers.message_handler
         data = yield msg_handler.get_room_data(
             user_id=user.to_string(),
             room_id=urllib.unquote(room_id),
-            event_type=RoomTopicEvent.TYPE,
-            state_key="",
+            event_type=event_type,
+            state_key=state_key,
         )
 
         if not data:
-            raise SynapseError(404, "Topic not found.", errcode=Codes.NOT_FOUND)
-        defer.returnValue((200, data.content))
+            raise SynapseError(404, "Event not found.", errcode=Codes.NOT_FOUND)
+        defer.returnValue((200, data[0].get_dict()["content"]))
 
     @defer.inlineCallbacks
-    def on_PUT(self, request, room_id):
+    def on_PUT(self, request, room_id, event_type, state_key):
         user = yield self.auth.get_user_by_req(request)
 
         content = _parse_json(request)
 
         event = self.event_factory.create_event(
-            etype=self.get_event_type(),
+            etype=event_type,
             content=content,
             room_id=urllib.unquote(room_id),
             user_id=user.to_string(),
+            state_key=state_key
             )
 
         msg_handler = self.handlers.message_handler
@@ -412,7 +435,7 @@ def _parse_json(request):
 
 
 def register_servlets(hs, http_server):
-    RoomTopicRestServlet(hs).register(http_server)
+    RoomStateEventRestServlet(hs).register(http_server)
     RoomMemberRestServlet(hs).register(http_server)
     MessageRestServlet(hs).register(http_server)
     FeedbackRestServlet(hs).register(http_server)