use axum::extract::State; use conduwuit::{Err, Result}; use ruma::api::client::alias::{create_alias, delete_alias, get_alias}; use crate::Ruma; /// # `PUT /_matrix/client/v3/directory/room/{roomAlias}` /// /// Creates a new room alias on this server. pub(crate) async fn create_alias_route( State(services): State, body: Ruma, ) -> Result { let sender_user = body.identity.sender_user(); if services.users.is_suspended(sender_user).await? { return Err!(Request(UserSuspended("You cannot perform this action while suspended."))); } services .rooms .alias .appservice_checks(&body.room_alias, body.identity.appservice_info()) .await?; // this isn't apart of alias_checks or delete alias route because we should // allow removing forbidden room aliases if services .globals .forbidden_alias_names() .is_match(body.room_alias.alias()) { return Err!(Request(Forbidden("Room alias is forbidden."))); } if services .rooms .alias .resolve_local_alias(&body.room_alias) .await .is_ok() { return Err!(Conflict("Alias already exists.")); } services .rooms .alias .set_alias(&body.room_alias, &body.room_id, sender_user)?; Ok(create_alias::v3::Response::new()) } /// # `DELETE /_matrix/client/v3/directory/room/{roomAlias}` /// /// Deletes a room alias from this server. /// /// - TODO: Update canonical alias event pub(crate) async fn delete_alias_route( State(services): State, body: Ruma, ) -> Result { let sender_user = body.identity.sender_user(); if services.users.is_suspended(sender_user).await? { return Err!(Request(UserSuspended("You cannot perform this action while suspended."))); } services .rooms .alias .appservice_checks(&body.room_alias, body.identity.appservice_info()) .await?; services .rooms .alias .remove_alias(&body.room_alias, sender_user) .await?; // TODO: update alt_aliases? Ok(delete_alias::v3::Response::new()) } /// # `GET /_matrix/client/v3/directory/room/{roomAlias}` /// /// Resolve an alias locally or over federation. pub(crate) async fn get_alias_route( State(services): State, body: Ruma, ) -> Result { let room_alias = body.body.room_alias; let Ok((room_id, servers)) = services.rooms.alias.resolve_alias(&room_alias).await else { return Err!(Request(NotFound("Room with alias not found."))); }; Ok(get_alias::v3::Response::new(room_id, servers)) }