diff --git a/src/main.rs b/src/main.rs index b8d7753..907d706 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/joined", web::get().to(api::room::joined_rooms)) .route("/api/room/{room_id}", web::get().to(api::room::info)) .route( "/api/media/{server_name}/{media_id}/download", diff --git a/src/server/api/room.rs b/src/server/api/room.rs index b1ee771..6afe1b5 100644 --- a/src/server/api/room.rs +++ b/src/server/api/room.rs @@ -2,11 +2,27 @@ 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::state; +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, +} + +/// 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,