Implemented /rooms/$roomid/[invite|join|leave] with POST / PUT (incl txn ids)
parent
732d954f89
commit
5c0be8fde3
|
@ -374,17 +374,41 @@ class RoomMembershipRestServlet(RestServlet):
|
||||||
"(?P<membership_action>join|invite|leave)")
|
"(?P<membership_action>join|invite|leave)")
|
||||||
register_txn_path(self, PATTERN, http_server)
|
register_txn_path(self, PATTERN, http_server)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
def on_POST(self, request, room_id, membership_action):
|
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):
|
def on_PUT(self, request, room_id, membership_action, txn_id):
|
||||||
(code, response) = self.txns.get_client_transaction(request, txn_id)
|
try:
|
||||||
if code:
|
defer.returnValue(self.txns.get_client_transaction(request, txn_id))
|
||||||
return (code, response)
|
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)
|
self.txns.store_client_transaction(request, txn_id, response)
|
||||||
return response
|
defer.returnValue(response)
|
||||||
|
|
||||||
|
|
||||||
def _parse_json(request):
|
def _parse_json(request):
|
||||||
|
|
|
@ -41,6 +41,7 @@ class HttpTransactionStore(object):
|
||||||
logger.debug("get_response Key: %s TxnId: %s", key, txn_id)
|
logger.debug("get_response Key: %s TxnId: %s", key, txn_id)
|
||||||
(last_txn_id, response) = self.transactions[key]
|
(last_txn_id, response) = self.transactions[key]
|
||||||
if txn_id == last_txn_id:
|
if txn_id == last_txn_id:
|
||||||
|
logger.info("get_response: Returning a response for %s", key)
|
||||||
return response
|
return response
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass
|
pass
|
||||||
|
@ -78,11 +79,13 @@ class HttpTransactionStore(object):
|
||||||
request must have the transaction ID as the last path segment.
|
request must have the transaction ID as the last path segment.
|
||||||
txn_id (str): The transaction ID for this request.
|
txn_id (str): The transaction ID for this request.
|
||||||
Returns:
|
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)
|
response = self.get_response(self._get_key(request), txn_id)
|
||||||
if response is None:
|
if response is None:
|
||||||
return (None, None)
|
raise KeyError("Transaction not found.")
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def _get_key(self, request):
|
def _get_key(self, request):
|
||||||
|
|
Loading…
Reference in New Issue