82 lines
2.0 KiB
Rust
82 lines
2.0 KiB
Rust
use crate::extractors::client_auth::APIClientAuth;
|
|
use crate::server::{HttpFailure, HttpResult};
|
|
use crate::utils::matrix_utils::ApiMxcURI;
|
|
use actix_web::{web, HttpResponse};
|
|
use ruma::api::client::{membership, state};
|
|
use ruma::events::StateEventType;
|
|
use ruma::{OwnedMxcUri, OwnedRoomId};
|
|
use serde::de::DeserializeOwned;
|
|
|
|
#[derive(serde::Serialize)]
|
|
struct GetRoomsMembershipsResponse {
|
|
rooms: Vec<OwnedRoomId>,
|
|
}
|
|
|
|
/// Get the list of rooms the user has joined
|
|
pub async fn joined_rooms(auth: APIClientAuth) -> HttpResult {
|
|
let res = auth
|
|
.send_request(membership::joined_rooms::v3::Request::default())
|
|
.await?;
|
|
|
|
Ok(HttpResponse::Ok().json(GetRoomsMembershipsResponse {
|
|
rooms: res.joined_rooms,
|
|
}))
|
|
}
|
|
|
|
#[derive(serde::Deserialize)]
|
|
pub struct RoomIDInPath {
|
|
room_id: OwnedRoomId,
|
|
}
|
|
|
|
#[derive(serde::Serialize)]
|
|
struct GetRoomInfoResponse {
|
|
name: Option<String>,
|
|
avatar: Option<ApiMxcURI>,
|
|
}
|
|
|
|
/// Get a room information
|
|
async fn get_room_info<E: DeserializeOwned>(
|
|
auth: &APIClientAuth,
|
|
room_id: OwnedRoomId,
|
|
event_type: StateEventType,
|
|
field: &str,
|
|
) -> anyhow::Result<Option<E>, HttpFailure> {
|
|
let res = auth
|
|
.send_request(state::get_state_events_for_key::v3::Request::new(
|
|
room_id,
|
|
event_type,
|
|
String::default(),
|
|
))
|
|
.await?;
|
|
|
|
Ok(res.content.get_field(field)?)
|
|
}
|
|
|
|
/// Get room information
|
|
pub async fn info(auth: APIClientAuth, path: web::Path<RoomIDInPath>) -> HttpResult {
|
|
let room_name: Option<String> = get_room_info(
|
|
&auth,
|
|
path.room_id.clone(),
|
|
StateEventType::RoomName,
|
|
"name",
|
|
)
|
|
.await
|
|
.ok()
|
|
.flatten();
|
|
|
|
let room_avatar: Option<OwnedMxcUri> = get_room_info(
|
|
&auth,
|
|
path.room_id.clone(),
|
|
StateEventType::RoomAvatar,
|
|
"url",
|
|
)
|
|
.await
|
|
.ok()
|
|
.flatten();
|
|
|
|
Ok(HttpResponse::Ok().json(GetRoomInfoResponse {
|
|
name: room_name,
|
|
avatar: room_avatar.map(ApiMxcURI),
|
|
}))
|
|
}
|