use std::collections::BTreeMap;
use reqwest::Url;
use salvo::prelude::*;
use serde::ser::SerializeStruct;
use serde::{Deserialize, Serialize, Serializer};
use crate::directory::{PublicRoomFilter, QueryCriteria, RoomNetwork, Server};
use crate::federation::discovery::ServerSigningKeys;
use crate::sending::{SendRequest, SendResult};
use crate::{OwnedServerName, OwnedServerSigningKeyId, UnixMillis};
pub fn public_rooms_request(origin: &str, body: PublicRoomsReqBody) -> SendResult<SendRequest> {
let url = Url::parse(&format!("{origin}/_matrix/federation/v1/publicRooms"))?;
crate::sending::get(url).stuff(body)
}
#[derive(ToSchema, Deserialize, Serialize, Debug)]
pub struct PublicRoomsReqBody {
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub since: Option<String>,
#[serde(default, skip_serializing_if = "PublicRoomFilter::is_empty")]
pub filter: PublicRoomFilter,
#[serde(flatten, skip_serializing_if = "crate::serde::is_default")]
pub room_network: RoomNetwork,
}
crate::json_body_modifier!(PublicRoomsReqBody);
#[derive(ToSchema, Serialize, Debug)]
pub struct ServerResBody {
#[serde(rename = "m.server")]
pub server: OwnedServerName,
}
impl ServerResBody {
pub fn new(server: OwnedServerName) -> Self {
Self { server }
}
}
pub fn remote_server_keys_batch_request(origin: &str, body: RemoteServerKeysBatchReqBody) -> SendResult<SendRequest> {
let url = Url::parse(&format!("{origin}/_matrix/key/v2/query",))?;
crate::sending::post(url).stuff(body)
}
#[derive(ToSchema, Deserialize, Serialize, Debug)]
pub struct RemoteServerKeysBatchReqBody {
pub server_keys: BTreeMap<OwnedServerName, BTreeMap<OwnedServerSigningKeyId, QueryCriteria>>,
}
crate::json_body_modifier!(RemoteServerKeysBatchReqBody);
#[derive(ToSchema, Serialize, Deserialize, Debug)]
pub struct RemoteServerKeysBatchResBody {
pub server_keys: Vec<ServerSigningKeys>,
}
impl RemoteServerKeysBatchResBody {
pub fn new(server_keys: Vec<ServerSigningKeys>) -> Self {
Self { server_keys }
}
}
pub fn remote_server_keys_request(origin: &str, args: RemoteServerKeysReqArgs) -> SendResult<SendRequest> {
let url = Url::parse(&format!(
"{origin}/_matrix/key/v2/query/{}?minimum_valid_until_ts={}",
args.server_name, args.minimum_valid_until_ts
))?;
Ok(crate::sending::get(url))
}
#[derive(ToParameters, Deserialize, Debug)]
pub struct RemoteServerKeysReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub server_name: OwnedServerName,
#[salvo(parameter(parameter_in = Query))]
#[serde(default = "UnixMillis::now")]
pub minimum_valid_until_ts: UnixMillis,
}
#[derive(ToSchema, Deserialize, Serialize, Debug)]
pub struct RemoteServerKeysResBody {
pub server_keys: Vec<ServerSigningKeys>,
}
impl RemoteServerKeysResBody {
pub fn new(server_keys: Vec<ServerSigningKeys>) -> Self {
Self { server_keys }
}
}
#[derive(ToSchema, Serialize, Default, Debug)]
pub struct ServerVersionResBody {
#[serde(skip_serializing_if = "Option::is_none")]
pub server: Option<Server>,
}
impl ServerVersionResBody {
pub fn new() -> Self {
Default::default()
}
}
#[derive(ToSchema, Serialize, Default, Debug)]
pub struct ServerVersionsResBody {
pub versions: Vec<String>,
}
impl ServerVersionsResBody {
pub fn new() -> Self {
Default::default()
}
}
pub fn server_keys_request(origin: &str) -> SendResult<SendRequest> {
let url = Url::parse(&format!("{origin}/_matrix/key/v2/server",))?;
Ok(crate::sending::get(url))
}
#[derive(ToSchema, Deserialize, Debug)]
pub struct ServerKeysResBody(
pub ServerSigningKeys,
);
impl ServerKeysResBody {
pub fn new(server_key: ServerSigningKeys) -> Self {
Self(server_key)
}
}
impl From<ServerSigningKeys> for ServerKeysResBody {
fn from(server_key: ServerSigningKeys) -> Self {
Self::new(server_key)
}
}
impl Serialize for ServerKeysResBody {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let mut st = serializer.serialize_struct("server_keys_res_body", 2)?;
st.serialize_field("old_verify_keys", &self.0.old_verify_keys)?;
st.serialize_field("server_name", &self.0.server_name)?;
st.serialize_field("signatures", &self.0.signatures)?;
st.serialize_field("valid_until_ts", &self.0.valid_until_ts)?;
st.serialize_field("verify_keys", &self.0.verify_keys)?;
st.end()
}
}