use std::collections::BTreeMap;
use reqwest::Url;
use salvo::prelude::*;
use serde::{Deserialize, Serialize};
use serde_json::Value as JsonValue;
use crate::sending::{SendRequest, SendResult};
use crate::user::ProfileField;
use crate::{OwnedRoomId, OwnedServerName, OwnedUserId, RoomAliasId};
pub fn directory_request(origin: &str, room_alias: &RoomAliasId) -> SendResult<SendRequest> {
let mut url = Url::parse(&format!("{origin}/_matrix/federation/v1/query/directory"))?;
url.query_pairs_mut().append_pair("room_alias", room_alias.as_str());
Ok(crate::sending::get(url))
}
#[derive(ToSchema, Serialize, Deserialize, Debug)]
pub struct RoomInfoResBody {
pub room_id: OwnedRoomId,
pub servers: Vec<OwnedServerName>,
}
impl RoomInfoResBody {
pub fn new(room_id: OwnedRoomId, servers: Vec<OwnedServerName>) -> Self {
Self { room_id, servers }
}
}
pub fn profile_request(origin: &str, args: ProfileReqArgs) -> SendResult<SendRequest> {
let mut url = Url::parse(&format!("{origin}/_matrix/federation/v1/query/profile"))?;
url.query_pairs_mut().append_pair("user_id", args.user_id.as_str());
if let Some(field) = &args.field {
url.query_pairs_mut().append_pair("field", &field.to_string());
}
Ok(crate::sending::get(url))
}
#[derive(ToParameters, Deserialize, Debug)]
pub struct ProfileReqArgs {
#[salvo(parameter(parameter_in = Query))]
pub user_id: OwnedUserId,
#[salvo(parameter(parameter_in = Query))]
#[serde(skip_serializing_if = "Option::is_none")]
pub field: Option<ProfileField>,
}
#[derive(ToSchema, Deserialize, Debug)]
pub struct CustomReqBody {
#[salvo(parameter(parameter_in = Path))]
pub query_type: String,
pub params: BTreeMap<String, String>,
}
#[derive(ToSchema, Serialize, Debug)]
#[salvo(schema(value_type = Object))]
pub struct CustomResBody(
pub JsonValue,
);
impl CustomResBody {
pub fn new(body: JsonValue) -> Self {
Self(body)
}
}