summary refs log tree commit diff
path: root/synapse/rest
diff options
context:
space:
mode:
authorKegan Dougal <kegan@matrix.org>2014-08-26 14:49:44 +0100
committerKegan Dougal <kegan@matrix.org>2014-08-26 14:49:44 +0100
commit5c0be8fde3602b9b7396cfdb2d689447f59217f7 (patch)
tree977e5832c0f09e71583c9d0219a21b6e11c194d7 /synapse/rest
parentAdded basic in-memory REST transaction storage. Only the latest transaction f... (diff)
downloadsynapse-5c0be8fde3602b9b7396cfdb2d689447f59217f7.tar.xz
Implemented /rooms/$roomid/[invite|join|leave] with POST / PUT (incl txn ids)
Diffstat (limited to '')
-rw-r--r--synapse/rest/room.py36
-rw-r--r--synapse/rest/transactions.py7
2 files changed, 35 insertions, 8 deletions
diff --git a/synapse/rest/room.py b/synapse/rest/room.py
index 4ca7e7e785..731317227d 100644
--- a/synapse/rest/room.py
+++ b/synapse/rest/room.py
@@ -374,17 +374,41 @@ class RoomMembershipRestServlet(RestServlet):
             "(?P<membership_action>join|invite|leave)")
         register_txn_path(self, PATTERN, http_server)
 
+    @defer.inlineCallbacks
     def on_POST(self, request, room_id, membership_action):
-        return (200, "POST Not implemented")
+        user = yield self.auth.get_user_by_req(request)
+
+        content = _parse_json(request)
 
+        # target user is you unless it is an invite
+        state_key = user.to_string()
+        if membership_action == "invite":
+            if "user_id" not in content:
+                raise SynapseError(400, "Missing user_id key.")
+            state_key = content["user_id"]
+
+        event = self.event_factory.create_event(
+            etype=RoomMemberEvent.TYPE,
+            content={"membership": unicode(membership_action)},
+            room_id=urllib.unquote(room_id),
+            user_id=user.to_string(),
+            state_key=state_key
+        )
+        handler = self.handlers.room_member_handler
+        yield handler.change_membership(event)
+        defer.returnValue((200, ""))
+
+    @defer.inlineCallbacks
     def on_PUT(self, request, room_id, membership_action, txn_id):
-        (code, response) = self.txns.get_client_transaction(request, txn_id)
-        if code:
-            return (code, response)
+        try:
+            defer.returnValue(self.txns.get_client_transaction(request, txn_id))
+        except:
+            pass
+
+        response = yield self.on_POST(request, room_id, membership_action)
 
-        response = (200, "PUT not implemented txnid %s" % txn_id)
         self.txns.store_client_transaction(request, txn_id, response)
-        return response
+        defer.returnValue(response)
 
 
 def _parse_json(request):
diff --git a/synapse/rest/transactions.py b/synapse/rest/transactions.py
index 10be10e903..b8aa1ef11c 100644
--- a/synapse/rest/transactions.py
+++ b/synapse/rest/transactions.py
@@ -41,6 +41,7 @@ class HttpTransactionStore(object):
             logger.debug("get_response Key: %s TxnId: %s", key, txn_id)
             (last_txn_id, response) = self.transactions[key]
             if txn_id == last_txn_id:
+                logger.info("get_response: Returning a response for %s", key)
                 return response
         except KeyError:
             pass
@@ -78,11 +79,13 @@ class HttpTransactionStore(object):
             request must have the transaction ID as the last path segment.
             txn_id (str): The transaction ID for this request.
         Returns:
-            The response tuple or (None, None).
+            The response tuple.
+        Raises:
+            KeyError if the transaction was not found.
         """
         response = self.get_response(self._get_key(request), txn_id)
         if response is None:
-            return (None, None)
+            raise KeyError("Transaction not found.")
         return response
 
     def _get_key(self, request):