Simplify room creation code

This commit is contained in:
Daniel Wagner-Hall 2016-02-15 18:13:10 +00:00
parent 4de08a4672
commit e560045cfd
2 changed files with 31 additions and 55 deletions

View file

@ -81,20 +81,20 @@ class RoomCreationHandler(BaseHandler):
} }
@defer.inlineCallbacks @defer.inlineCallbacks
def create_room(self, user_id, room_id, config): def create_room(self, requester, config):
""" Creates a new room. """ Creates a new room.
Args: Args:
user_id (str): The ID of the user creating the new room. requester (Requester): The user who requested the room creation.
room_id (str): The proposed ID for the new room. Can be None, in
which case one will be created for you.
config (dict) : A dict of configuration options. config (dict) : A dict of configuration options.
Returns: Returns:
The new room ID. The new room ID.
Raises: Raises:
SynapseError if the room ID was taken, couldn't be stored, or SynapseError if the room ID couldn't be stored, or something went
something went horribly wrong. horribly wrong.
""" """
user_id = requester.user.to_string()
self.ratelimit(user_id) self.ratelimit(user_id)
if "room_alias_name" in config: if "room_alias_name" in config:
@ -126,40 +126,28 @@ class RoomCreationHandler(BaseHandler):
is_public = config.get("visibility", None) == "public" is_public = config.get("visibility", None) == "public"
if room_id: # autogen room IDs and try to create it. We may clash, so just
# Ensure room_id is the correct type # try a few times till one goes through, giving up eventually.
room_id_obj = RoomID.from_string(room_id) attempts = 0
if not self.hs.is_mine(room_id_obj): room_id = None
raise SynapseError(400, "Room id must be local") while attempts < 5:
try:
yield self.store.store_room( random_string = stringutils.random_string(18)
room_id=room_id, gen_room_id = RoomID.create(
room_creator_user_id=user_id, random_string,
is_public=is_public self.hs.hostname,
) )
else: yield self.store.store_room(
# autogen room IDs and try to create it. We may clash, so just room_id=gen_room_id.to_string(),
# try a few times till one goes through, giving up eventually. room_creator_user_id=user_id,
attempts = 0 is_public=is_public
room_id = None )
while attempts < 5: room_id = gen_room_id.to_string()
try: break
random_string = stringutils.random_string(18) except StoreError:
gen_room_id = RoomID.create( attempts += 1
random_string, if not room_id:
self.hs.hostname, raise StoreError(500, "Couldn't generate a room ID.")
)
yield self.store.store_room(
room_id=gen_room_id.to_string(),
room_creator_user_id=user_id,
is_public=is_public
)
room_id = gen_room_id.to_string()
break
except StoreError:
attempts += 1
if not room_id:
raise StoreError(500, "Couldn't generate a room ID.")
if room_alias: if room_alias:
directory_handler = self.hs.get_handlers().directory_handler directory_handler = self.hs.get_handlers().directory_handler

View file

@ -63,24 +63,12 @@ class RoomCreateRestServlet(ClientV1RestServlet):
def on_POST(self, request): def on_POST(self, request):
requester = yield self.auth.get_user_by_req(request) requester = yield self.auth.get_user_by_req(request)
room_config = self.get_room_config(request)
info = yield self.make_room(
room_config,
requester.user,
None,
)
room_config.update(info)
defer.returnValue((200, info))
@defer.inlineCallbacks
def make_room(self, room_config, auth_user, room_id):
handler = self.handlers.room_creation_handler handler = self.handlers.room_creation_handler
info = yield handler.create_room( info = yield handler.create_room(
user_id=auth_user.to_string(), requester, self.get_room_config(request)
room_id=room_id,
config=room_config
) )
defer.returnValue(info)
defer.returnValue((200, info))
def get_room_config(self, request): def get_room_config(self, request):
try: try: