Skip to main content

tuwunel_api/client/membership/
leave.rs

1use axum::extract::State;
2use futures::FutureExt;
3use ruma::api::client::membership::leave_room;
4use tuwunel_core::Result;
5
6use crate::Ruma;
7
8/// # `POST /_matrix/client/v3/rooms/{roomId}/leave`
9///
10/// Tries to leave the sender user from a room.
11///
12/// - This should always work if the user is currently joined.
13pub(crate) async fn leave_room_route(
14	State(services): State<crate::State>,
15	body: Ruma<leave_room::v3::Request>,
16) -> Result<leave_room::v3::Response> {
17	let state_lock = services.state.mutex.lock(&body.room_id).await;
18
19	services
20		.membership
21		.leave(body.sender_user(), &body.room_id, body.reason.clone(), false, &state_lock)
22		.boxed()
23		.await?;
24
25	if services.config.delete_rooms_after_leave {
26		services
27			.delete
28			.delete_if_empty_local(&body.room_id, state_lock)
29			.boxed()
30			.await;
31	}
32
33	Ok(leave_room::v3::Response {})
34}