tuwunel_api/client/membership/
knock.rs1use axum::extract::State;
2use ruma::api::client::knock::knock_room;
3use tuwunel_core::Result;
4
5use super::banned_room_check;
6use crate::{ClientIp, Ruma};
7
8#[tracing::instrument(skip_all, fields(%client), name = "knock")]
12pub(crate) async fn knock_room_route(
13 State(services): State<crate::State>,
14 ClientIp(client): ClientIp,
15 body: Ruma<knock_room::v3::Request>,
16) -> Result<knock_room::v3::Response> {
17 let sender_user = body.sender_user();
18
19 let (room_id, servers) = services
20 .alias
21 .maybe_resolve_with_servers(&body.room_id_or_alias, Some(&body.via))
22 .await?;
23
24 banned_room_check(&services, sender_user, &room_id, Some(&body.room_id_or_alias), client)
25 .await?;
26
27 let state_lock = services.state.mutex.lock(&room_id).await;
28
29 services
30 .membership
31 .knock(
32 sender_user,
33 &room_id,
34 Some(&body.room_id_or_alias),
35 body.reason.clone(),
36 &servers,
37 &state_lock,
38 )
39 .await?;
40
41 drop(state_lock);
42
43 Ok(knock_room::v3::Response::new(room_id.clone()))
44}