From 4e001abe92dad09ccdf7e985875af1ed1ad2d539 Mon Sep 17 00:00:00 2001 From: Ginger Date: Mon, 27 Jul 2026 15:12:07 -0400 Subject: [PATCH] feat: Add stable mutual rooms endpoint --- Cargo.lock | 22 ++++++++++----------- Cargo.toml | 4 +--- src/api/client/mutual_rooms.rs | 36 +++++++++++++++++++++++++++++++--- src/api/router.rs | 1 + src/core/matrix/versions.rs | 1 + 5 files changed, 47 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8063201b5..4209196f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4567,7 +4567,7 @@ dependencies = [ [[package]] name = "ruma" version = "0.16.0" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "assign", "js_int", @@ -4586,7 +4586,7 @@ dependencies = [ [[package]] name = "ruma-appservice-api" version = "0.16.0" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "js_int", "ruma-common", @@ -4598,7 +4598,7 @@ dependencies = [ [[package]] name = "ruma-client-api" version = "0.24.0" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "as_variant", "assign", @@ -4620,7 +4620,7 @@ dependencies = [ [[package]] name = "ruma-common" version = "0.19.0" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "as_variant", "base64 0.22.1", @@ -4653,7 +4653,7 @@ dependencies = [ [[package]] name = "ruma-events" version = "0.34.0" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "as_variant", "indexmap 2.14.0", @@ -4674,7 +4674,7 @@ dependencies = [ [[package]] name = "ruma-federation-api" version = "0.15.0" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "bytes", "headers", @@ -4697,7 +4697,7 @@ dependencies = [ [[package]] name = "ruma-identifiers-validation" version = "0.12.1" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "js_int", "thiserror 2.0.19", @@ -4706,7 +4706,7 @@ dependencies = [ [[package]] name = "ruma-macros" version = "0.19.0" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "as_variant", "cfg-if", @@ -4722,7 +4722,7 @@ dependencies = [ [[package]] name = "ruma-push-gateway-api" version = "0.15.0" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "js_int", "ruma-common", @@ -4734,7 +4734,7 @@ dependencies = [ [[package]] name = "ruma-signatures" version = "0.21.0" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "base64 0.22.1", "ed25519-dalek", @@ -4751,7 +4751,7 @@ dependencies = [ [[package]] name = "ruma-state-res" version = "0.17.0" -source = "git+https://github.com/ruma/ruma.git?rev=3ad047126b321d5fdcf170e1f2e545fed820cf75#3ad047126b321d5fdcf170e1f2e545fed820cf75" +source = "git+https://github.com/ruma/ruma.git?rev=e7284c31da289f0a3b885191f5b2b6b307fa059f#e7284c31da289f0a3b885191f5b2b6b307fa059f" dependencies = [ "js_int", "ruma-common", diff --git a/Cargo.toml b/Cargo.toml index 0bcf4ef27..c532701b3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -342,9 +342,8 @@ version = "1.1.1" # Used for matrix spec type definitions and helpers [workspace.dependencies.ruma] -# version = "0.14.1" git = "https://github.com/ruma/ruma.git" -rev = "3ad047126b321d5fdcf170e1f2e545fed820cf75" +rev = "e7284c31da289f0a3b885191f5b2b6b307fa059f" features = [ "appservice-api-c", "client-api", @@ -357,7 +356,6 @@ features = [ "compat-upload-signatures", "compat-optional-txn-pdus", "compat-get-3pids", - "unstable-msc2666", "unstable-msc2867", "unstable-msc2870", "unstable-msc3061", diff --git a/src/api/client/mutual_rooms.rs b/src/api/client/mutual_rooms.rs index a20a3c432..950c9c913 100644 --- a/src/api/client/mutual_rooms.rs +++ b/src/api/client/mutual_rooms.rs @@ -1,7 +1,7 @@ use axum::extract::State; use conduwuit::{Err, Result}; use futures::StreamExt; -use ruma::api::client::membership::mutual_rooms; +use ruma::{OwnedRoomId, api::client::membership::mutual_rooms}; use crate::Ruma; @@ -11,14 +11,14 @@ /// /// An implementation of [MSC2666](https://github.com/matrix-org/matrix-spec-proposals/pull/2666) #[tracing::instrument(skip_all, name = "mutual_rooms", level = "info")] -pub(crate) async fn get_mutual_rooms_route( +pub(crate) async fn get_mutual_rooms_unstable_route( State(services): State, body: Ruma, ) -> Result { let sender_user = body.identity.expect_sender_user()?; if sender_user == body.user_id { - return Err!(Request(Unknown("You cannot request rooms in common with yourself."))); + return Err!(Request(InvalidParam("You cannot request rooms in common with yourself."))); } let mutual_rooms = services @@ -30,3 +30,33 @@ pub(crate) async fn get_mutual_rooms_route( Ok(mutual_rooms::unstable::Response::new(mutual_rooms)) } + +/// # `GET /_matrix/client/v1/mutual_rooms` +/// +/// Gets all the rooms the sender shares with the specified user. +#[tracing::instrument(skip_all, name = "mutual_rooms", level = "info")] +pub(crate) async fn get_mutual_rooms_route( + State(services): State, + body: Ruma, +) -> Result { + let sender_user = body.identity.expect_sender_user()?; + + if sender_user == body.user_id { + return Err!(Request(InvalidParam("You cannot request rooms in common with yourself."))); + } + + let mutual_rooms: Vec = services + .rooms + .state_cache + .get_shared_rooms(sender_user, &body.user_id) + .collect() + .await; + + Ok(mutual_rooms::v1::Response::new( + mutual_rooms + .len() + .try_into() + .expect("user should be in fewer than 9.1 quadrillion rooms"), + mutual_rooms, + )) +} diff --git a/src/api/router.rs b/src/api/router.rs index ac447ffc6..6b972043d 100644 --- a/src/api/router.rs +++ b/src/api/router.rs @@ -177,6 +177,7 @@ pub fn build(router: Router, state: State) -> Router { .ruma_route(&client::get_relating_events_with_rel_type_route) .ruma_route(&client::get_relating_events_route) .ruma_route(&client::get_hierarchy_route) + .ruma_route(&client::get_mutual_rooms_unstable_route) .ruma_route(&client::get_mutual_rooms_route) .ruma_route(&client::get_room_summary) .ruma_route(&client::get_suspended_status) diff --git a/src/core/matrix/versions.rs b/src/core/matrix/versions.rs index 19801a0e0..e5da78e96 100644 --- a/src/core/matrix/versions.rs +++ b/src/core/matrix/versions.rs @@ -34,6 +34,7 @@ pub fn unstable_features() -> BTreeMap { // query mutual rooms (https://github.com/matrix-org/matrix-spec-proposals/pull/2666) // Expected for spec v1.19 ("uk.half-shot.msc2666.query_mutual_rooms".to_owned(), true), + ("uk.half-shot.msc2666.query_mutual_rooms.stable".to_owned(), true), // Simplified Sliding sync (https://github.com/matrix-org/matrix-spec-proposals/pull/4186) // Expected for spec v1.19 ("org.matrix.simplified_msc3575".to_owned(), true),