feat: allow querying conduit's room list over federation

This commit is contained in:
Timo 2020-08-14 11:29:32 +02:00
parent 940f533d61
commit 4be68eba76
No known key found for this signature in database
GPG Key ID: 24DA7517711A2BA4
2 changed files with 92 additions and 5 deletions

View File

@ -114,6 +114,8 @@ fn setup_rocket() -> rocket::Rocket {
server_server::get_server_version, server_server::get_server_version,
server_server::get_server_keys, server_server::get_server_keys,
server_server::get_server_keys_deprecated, server_server::get_server_keys_deprecated,
server_server::get_public_rooms_route,
server_server::send_transaction_message_route,
], ],
) )
.attach(AdHoc::on_attach("Config", |mut rocket| async { .attach(AdHoc::on_attach("Config", |mut rocket| async {

View File

@ -1,10 +1,14 @@
use crate::{ConduitResult, Database, Result}; use crate::{client_server, ConduitResult, Database, Error, Result, Ruma};
use http::header::{HeaderValue, AUTHORIZATION}; use http::header::{HeaderValue, AUTHORIZATION};
use rocket::{get, response::content::Json, State}; use rocket::{get, post, put, response::content::Json, State};
use ruma::api::federation::discovery::{ use ruma::api::federation::{
get_server_keys, get_server_version::v1 as get_server_version, ServerKey, VerifyKey, directory::get_public_rooms,
discovery::{
get_server_keys, get_server_version::v1 as get_server_version, ServerKey, VerifyKey,
},
transactions::send_transaction_message,
}; };
use ruma::api::OutgoingRequest; use ruma::api::{client, OutgoingRequest};
use serde_json::json; use serde_json::json;
use std::{ use std::{
collections::BTreeMap, collections::BTreeMap,
@ -193,3 +197,84 @@ pub fn get_server_keys(db: State<'_, Database>) -> Json<String> {
pub fn get_server_keys_deprecated(db: State<'_, Database>) -> Json<String> { pub fn get_server_keys_deprecated(db: State<'_, Database>) -> Json<String> {
get_server_keys(db) get_server_keys(db)
} }
#[cfg_attr(
feature = "conduit_bin",
post("/_matrix/federation/v1/publicRooms", data = "<body>")
)]
pub async fn get_public_rooms_route(
db: State<'_, Database>,
body: Ruma<get_public_rooms::v1::Request>,
) -> ConduitResult<get_public_rooms::v1::Response> {
let Ruma {
body:
get_public_rooms::v1::Request {
room_network: _room_network, // TODO
limit,
since,
},
sender_id,
device_id,
json_body,
} = body;
let client::r0::directory::get_public_rooms_filtered::Response {
chunk,
prev_batch,
next_batch,
total_room_count_estimate,
} = client_server::get_public_rooms_filtered_route(
db,
Ruma {
body: client::r0::directory::get_public_rooms_filtered::IncomingRequest {
filter: None,
limit,
room_network: client::r0::directory::get_public_rooms_filtered::RoomNetwork::Matrix,
server: None,
since,
},
sender_id,
device_id,
json_body,
},
)
.await?
.0;
Ok(get_public_rooms::v1::Response {
chunk: chunk
.into_iter()
.map(|c| {
// Convert ruma::api::federation::directory::get_public_rooms::v1::PublicRoomsChunk
// to ruma::api::client::r0::directory::PublicRoomsChunk
Ok::<_, Error>(
serde_json::from_str(
&serde_json::to_string(&c)
.expect("PublicRoomsChunk::to_string always works"),
)
.expect("federation and client-server PublicRoomsChunk are the same type"),
)
})
.filter_map(|r| r.ok())
.collect(),
prev_batch,
next_batch,
total_room_count_estimate,
}
.into())
}
#[cfg_attr(
feature = "conduit_bin",
put("/_matrix/federation/v1/send/<_>", data = "<body>")
)]
pub fn send_transaction_message_route(
db: State<'_, Database>,
body: Ruma<send_transaction_message::v1::Request>,
) -> ConduitResult<send_transaction_message::v1::Response> {
dbg!(&*body);
Ok(send_transaction_message::v1::Response {
pdus: BTreeMap::new(),
}
.into())
}