use salvo::prelude::*;
use serde::{Deserialize, Serialize};
use crate::events::space::child::HierarchySpaceChildEvent;
use crate::{OwnedMxcUri, OwnedRoomAliasId, OwnedRoomId, room::RoomType, serde::RawJson, space::SpaceRoomJoinRule};
#[derive(ToSchema, Deserialize, Serialize, Clone, Debug)]
pub struct SpaceHierarchyRoomsChunk {
#[serde(
skip_serializing_if = "Option::is_none",
default,
deserialize_with = "crate::serde::empty_string_as_none"
)]
pub canonical_alias: Option<OwnedRoomAliasId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default)]
pub num_joined_members: u64,
pub room_id: OwnedRoomId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub topic: Option<String>,
#[serde(default)]
pub world_readable: bool,
#[serde(default)]
pub guest_can_join: bool,
#[serde(
skip_serializing_if = "Option::is_none",
default,
deserialize_with = "crate::serde::empty_string_as_none"
)]
pub avatar_url: Option<OwnedMxcUri>,
#[serde(default, skip_serializing_if = "crate::serde::is_default")]
pub join_rule: SpaceRoomJoinRule,
#[serde(skip_serializing_if = "Option::is_none")]
pub room_type: Option<RoomType>,
pub children_state: Vec<RawJson<HierarchySpaceChildEvent>>,
}
#[derive(Debug)]
#[allow(clippy::exhaustive_structs)]
pub struct SpaceHierarchyRoomsChunkInit {
pub num_joined_members: u64,
pub room_id: OwnedRoomId,
pub world_readable: bool,
pub guest_can_join: bool,
pub join_rule: SpaceRoomJoinRule,
pub children_state: Vec<RawJson<HierarchySpaceChildEvent>>,
}
impl From<SpaceHierarchyRoomsChunkInit> for SpaceHierarchyRoomsChunk {
fn from(init: SpaceHierarchyRoomsChunkInit) -> Self {
let SpaceHierarchyRoomsChunkInit {
num_joined_members,
room_id,
world_readable,
guest_can_join,
join_rule,
children_state,
} = init;
Self {
canonical_alias: None,
name: None,
num_joined_members,
room_id,
topic: None,
world_readable,
guest_can_join,
avatar_url: None,
join_rule,
room_type: None,
children_state,
}
}
}
#[derive(ToParameters, Deserialize, Debug)]
pub struct HierarchyReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub room_id: OwnedRoomId,
#[salvo(parameter(parameter_in = Query))]
pub from: Option<String>,
#[salvo(parameter(parameter_in = Query))]
pub limit: Option<usize>,
#[salvo(parameter(parameter_in = Query))]
pub max_depth: Option<usize>,
#[salvo(parameter(parameter_in = Query))]
#[serde(default, skip_serializing_if = "crate::serde::is_default")]
pub suggested_only: bool,
}
#[derive(ToSchema, Serialize, Debug)]
pub struct HierarchyResBody {
#[serde(skip_serializing_if = "Option::is_none")]
pub next_batch: Option<String>,
pub rooms: Vec<SpaceHierarchyRoomsChunk>,
}