use ruma::{
OwnedRoomAliasId, OwnedRoomId, OwnedUserId, UInt,
api::{auth_scheme::AccessToken, metadata, request, response},
events::room::{guest_access::GuestAccess, history_visibility::HistoryVisibility},
room::{JoinRuleKind, RoomType},
serde::StringEnum,
uint,
};
use serde::{Deserialize, Serialize};
metadata! {
method: GET,
rate_limited: false,
authentication: AccessToken,
path: "/_synapse/admin/v1/rooms",
}
#[request]
#[derive(Default)]
pub struct Request {
#[serde(skip_serializing_if = "Option::is_none")]
#[ruma_api(query)]
pub from: Option<UInt>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ruma_api(query)]
pub limit: Option<UInt>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ruma_api(query)]
pub order_by: Option<RoomSortOrder>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ruma_api(query)]
pub dir: Option<SortDirection>,
#[serde(skip_serializing_if = "Option::is_none")]
#[ruma_api(query)]
pub search_term: Option<String>,
}
#[derive(Default)]
#[response]
pub struct Response {
pub rooms: Vec<RoomDetails>,
pub offset: UInt,
pub total_rooms: UInt,
pub next_batch: Option<UInt>,
pub prev_batch: Option<UInt>,
}
impl Request {
pub fn new() -> Self {
Default::default()
}
}
impl Response {
pub fn new() -> Self {
Default::default()
}
}
#[derive(Clone, StringEnum)]
#[ruma_enum(rename_all = "snake_case")]
#[non_exhaustive]
pub enum RoomSortOrder {
Name,
CanonicalAlias,
JoinedMembers,
JoinedLocalMembers,
Version,
Creator,
Encryption,
Federatable,
Public,
JoinRules,
GuestAccess,
HistoryVisibility,
StateEvents,
#[doc(hidden)]
_Custom(crate::PrivOwnedStr),
}
#[derive(Clone, StringEnum)]
#[non_exhaustive]
pub enum SortDirection {
#[ruma_enum(rename = "b")]
Backward,
#[ruma_enum(rename = "f")]
Forward,
#[doc(hidden)]
_Custom(crate::PrivOwnedStr),
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[cfg_attr(not(ruma_unstable_exhaustive_types), non_exhaustive)]
pub struct RoomDetails {
pub room_id: OwnedRoomId,
pub name: Option<String>,
pub canonical_alias: Option<OwnedRoomAliasId>,
pub joined_members: UInt,
pub joined_local_members: UInt,
pub version: Option<String>,
#[serde(deserialize_with = "ruma::serde::empty_string_as_none")]
pub creator: Option<OwnedUserId>,
pub encryption: Option<String>,
#[serde(deserialize_with = "crate::serde::bool_or_uint")]
pub federatable: bool,
#[serde(deserialize_with = "crate::serde::bool_or_uint")]
pub public: bool,
pub join_rules: Option<JoinRuleKind>,
pub guest_access: Option<GuestAccess>,
pub history_visibility: Option<HistoryVisibility>,
pub state_events: UInt,
pub room_type: Option<RoomType>,
}
impl RoomDetails {
pub fn new(room_id: OwnedRoomId) -> Self {
Self {
room_id,
name: None,
canonical_alias: None,
joined_members: uint!(0),
joined_local_members: uint!(0),
version: None,
creator: None,
encryption: None,
federatable: false,
public: false,
join_rules: None,
guest_access: None,
history_visibility: None,
state_events: uint!(0),
room_type: None,
}
}
}