Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Add module API method to create a room #13429

Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/13429.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add a module API method to create a room.
59 changes: 59 additions & 0 deletions synapse/module_api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -1452,6 +1452,65 @@ async def get_monthly_active_users_by_service(
start_timestamp, end_timestamp
)

async def create_room(
self,
user_id: str,
config: JsonDict,
ratelimit: bool = True,
creator_join_profile: Optional[JsonDict] = None,
) -> Tuple[dict, int]:
"""Creates a new room.
babolivier marked this conversation as resolved.
Show resolved Hide resolved

Args:
user_id:
The user who requested the room creation.
config : A dict of configuration options. See "Request body" of:
https://spec.matrix.org/latest/client-server-api/#post_matrixclientv3createroom
ratelimit: set to False to disable the rate limiter.
babolivier marked this conversation as resolved.
Show resolved Hide resolved

creator_join_profile:
Set to override the displayname and avatar for the creating
user in this room. If unset, displayname and avatar will be
derived from the user's profile. If set, should contain the
values to go in the body of the 'join' event (typically
`avatar_url` and/or `displayname`.

Returns:
First, a dict containing the keys `room_id` and, if an alias
was, requested, `room_alias`. Secondly, the stream_id of the
last persisted event.
babolivier marked this conversation as resolved.
Show resolved Hide resolved
Raises:
SynapseError if the user does not exist, room ID couldn't be stored, or
something went horribly wrong.
ResourceLimitError if server is blocked to some resource being
exceeded.
"""
user_info = await self.get_userinfo_by_id(user_id)
if user_info is None:
raise SynapseError(400, f"User ({user_id}) not found")

if user_info.appservice_id is not None:
app_service = self._store.get_app_service_by_id(
str(user_info.appservice_id)
)
else:
app_service = None

requester = create_requester(
babolivier marked this conversation as resolved.
Show resolved Hide resolved
user_id=user_id,
is_guest=user_info.is_guest,
shadow_banned=user_info.is_shadow_banned,
app_service=app_service,
authenticated_entity=self.server_name,
)

return await self._hs.get_room_creation_handler().create_room(
requester=requester,
config=config,
ratelimit=ratelimit,
creator_join_profile=creator_join_profile,
)


class PublicRoomListManager:
"""Contains methods for adding to, removing from and querying whether a room
Expand Down
28 changes: 27 additions & 1 deletion tests/module_api/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@
from twisted.internet import defer

from synapse.api.constants import EduTypes, EventTypes
from synapse.api.errors import SynapseError
from synapse.events import EventBase
from synapse.federation.units import Transaction
from synapse.handlers.presence import UserPresenceState
from synapse.handlers.push_rules import InvalidRuleException
from synapse.rest import admin
from synapse.rest.client import login, notifications, presence, profile, room
from synapse.rest.client import directory, login, notifications, presence, profile, room
from synapse.types import create_requester

from tests.events.test_presence_router import send_presence_update, sync_presence
Expand All @@ -40,6 +41,7 @@ class ModuleApiTestCase(HomeserverTestCase):
presence.register_servlets,
profile.register_servlets,
notifications.register_servlets,
directory.register_servlets,
]

def prepare(self, reactor, clock, homeserver):
Expand Down Expand Up @@ -635,6 +637,30 @@ def test_check_push_rules_actions(self) -> None:
[{"set_tweak": "sound", "value": "default"}]
)

def test_create_room(self) -> None:
babolivier marked this conversation as resolved.
Show resolved Hide resolved
"""Test that modules can create a room."""
# First test user existence verification.
self.get_failure(
self.module_api.create_room(
user_id="@user:test", config={}, ratelimit=False
),
SynapseError,
)

# Now do the happy path.
user_id = self.register_user("user", "password")

(result, _) = self.get_success(
self.module_api.create_room(user_id=user_id, config={}, ratelimit=False)
)
room_id = result["room_id"]

channel = self.make_request(
"GET",
f"/_matrix/client/r0/directory/list/room/{room_id}",
babolivier marked this conversation as resolved.
Show resolved Hide resolved
)
self.assertEqual(channel.code, 200, channel.result)


class ModuleApiWorkerTestCase(BaseMultiWorkerStreamTestCase):
"""For testing ModuleApi functionality in a multi-worker setup"""
Expand Down