tuwunel_service/membership/
unban.rs1use ruma::{
2 RoomId, UserId,
3 events::room::member::{MembershipState, RoomMemberEventContent},
4};
5use tuwunel_core::{Err, Result, implement, pdu::PduBuilder};
6
7use super::Service;
8use crate::rooms::timeline::RoomMutexGuard;
9
10#[implement(Service)]
11#[tracing::instrument(
12 name = "remote",
13 level = "debug",
14 skip_all,
15 fields(%sender_user, %room_id, %user_id),
16)]
17pub async fn unban(
18 &self,
19 room_id: &RoomId,
20 user_id: &UserId,
21 reason: Option<&String>,
22 sender_user: &UserId,
23 state_lock: &RoomMutexGuard,
24) -> Result {
25 let current_member_content = self
26 .services
27 .state_accessor
28 .get_member(room_id, user_id)
29 .await
30 .unwrap_or_else(|_| RoomMemberEventContent::new(MembershipState::Leave));
31
32 if current_member_content.membership != MembershipState::Ban {
33 return Err!(Request(Forbidden(
34 "Cannot unban a user who is not banned (current membership: {})",
35 current_member_content.membership
36 )));
37 }
38
39 self.services
40 .timeline
41 .build_and_append_pdu(
42 PduBuilder::state(user_id.to_string(), &RoomMemberEventContent {
43 membership: MembershipState::Leave,
44 reason: reason.cloned(),
45 join_authorized_via_users_server: None,
46 third_party_invite: None,
47 is_direct: None,
48 ..current_member_content
49 }),
50 sender_user,
51 room_id,
52 state_lock,
53 )
54 .await?;
55
56 Ok(())
57}