diff --git a/src/main.rs b/src/main.rs index 36ca740..5e09b38 100644 --- a/src/main.rs +++ b/src/main.rs @@ -57,6 +57,7 @@ async fn main() -> std::io::Result<()> { .route("/api", web::get().to(api::api_home)) .route("/api", web::post().to(api::api_home)) .route("/api/account/whoami", web::get().to(api::account::who_am_i)) + .route("/api/room/{room_id}/name", web::get().to(api::rooms::name)) .service(web::resource("/api/ws").route(web::get().to(api::ws::ws))) }) .workers(4) diff --git a/src/server/api/mod.rs b/src/server/api/mod.rs index f515e3e..80192f2 100644 --- a/src/server/api/mod.rs +++ b/src/server/api/mod.rs @@ -3,6 +3,7 @@ use crate::server::HttpResult; use actix_web::HttpResponse; pub mod account; +pub mod rooms; pub mod ws; /// API Home route diff --git a/src/server/api/rooms.rs b/src/server/api/rooms.rs new file mode 100644 index 0000000..50ff801 --- /dev/null +++ b/src/server/api/rooms.rs @@ -0,0 +1,31 @@ +use crate::extractors::client_auth::APIClientAuth; +use crate::server::HttpResult; +use actix_web::{web, HttpResponse}; +use ruma::api::client::state; +use ruma::events::StateEventType; +use ruma::OwnedRoomId; + +#[derive(serde::Deserialize)] +pub struct RoomIDInPath { + room_id: OwnedRoomId, +} + +#[derive(serde::Serialize)] +struct GetRoomNameResponse { + name: String, +} + +/// Get room name +pub async fn name(auth: APIClientAuth, path: web::Path) -> HttpResult { + let res = auth + .send_request(state::get_state_events_for_key::v3::Request::new( + path.room_id.clone(), + StateEventType::RoomName, + String::default(), + )) + .await?; + + Ok(HttpResponse::Ok().json(GetRoomNameResponse { + name: res.content.get_field("name")?.unwrap_or("").to_string(), + })) +} diff --git a/src/server/mod.rs b/src/server/mod.rs index a1c79c7..007cd9f 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -26,8 +26,10 @@ pub enum HttpFailure { InternalError(#[from] anyhow::Error), #[error("a matrix api client error occurred: {0}")] MatrixApiClientError(#[from] ruma::api::client::Error), - #[error("a matrix client error occurred: {0}")] + #[error("a matrix client error occurred: {0}")] MatrixClientError(String), + #[error("a serde_json error occurred: {0}")] + SerdeJsonError(#[from] serde_json::error::Error), } impl ResponseError for HttpFailure {