mod alias;
mod thread;
pub use thread::*;
pub use alias::*;
use salvo::prelude::*;
use serde::{Deserialize, Serialize};
use crate::client::filter::RoomEventFilter;
use crate::client::membership::InviteThreepid;
use crate::events::{
AnyInitialStateEvent, AnyStateEvent, AnyTimelineEvent,
room::{create::PreviousRoom, power_levels::RoomPowerLevelsEventContent},
};
use crate::room::{RoomType, Visibility};
use crate::serde::{RawJson, StringEnum};
use crate::{
Direction, OwnedEventId, OwnedRoomId, OwnedRoomOrAliasId, OwnedServerName, OwnedUserId, PrivOwnedStr,
RoomVersionId, UnixMillis,
};
#[derive(ToSchema, Deserialize, Debug)]
pub struct CreateRoomReqBody {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub creation_content: Option<RawJson<CreationContent>>,
#[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub initial_state: Vec<RawJson<AnyInitialStateEvent>>,
#[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub invite: Vec<OwnedUserId>,
#[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub invite_3pid: Vec<InviteThreepid>,
#[serde(default, skip_serializing_if = "crate::serde::is_default")]
pub is_direct: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub power_level_content_override: Option<RawJson<RoomPowerLevelsEventContent>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub preset: Option<RoomPreset>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub room_alias_name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub room_version: Option<RoomVersionId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub topic: Option<String>,
#[serde(default, skip_serializing_if = "crate::serde::is_default")]
pub visibility: Visibility,
}
#[derive(ToSchema, Serialize, Debug)]
pub struct CreateRoomResBody {
pub room_id: OwnedRoomId,
}
#[derive(ToSchema, Deserialize, Serialize, Clone, Debug)]
pub struct CreationContent {
#[serde(
rename = "m.federate",
default = "crate::serde::default_true",
skip_serializing_if = "crate::serde::is_true"
)]
pub federate: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub predecessor: Option<PreviousRoom>,
#[serde(default, skip_serializing_if = "Option::is_none", rename = "type")]
pub room_type: Option<RoomType>,
}
impl CreationContent {
pub fn new() -> Self {
Self {
federate: true,
predecessor: None,
room_type: None,
}
}
pub fn is_empty(&self) -> bool {
self.federate && self.predecessor.is_none() && self.room_type.is_none()
}
}
impl Default for CreationContent {
fn default() -> Self {
Self::new()
}
}
#[doc = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/src/doc/string_enum.md"))]
#[derive(ToSchema, Clone, PartialEq, Eq, StringEnum)]
#[palpo_enum(rename_all = "snake_case")]
#[non_exhaustive]
pub enum RoomPreset {
PrivateChat,
PublicChat,
TrustedPrivateChat,
#[doc(hidden)]
#[salvo(schema(value_type = String))]
_Custom(PrivOwnedStr),
}
#[derive(ToSchema, Deserialize, Debug)]
pub struct UpgradeRoomReqBody {
pub new_version: RoomVersionId,
}
#[derive(ToSchema, Serialize, Debug)]
pub struct UpgradeRoomResBody {
pub replacement_room: OwnedRoomId,
}
#[derive(ToParameters, Deserialize, Debug)]
pub struct EventByTimestampReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub room_id: OwnedRoomId,
#[salvo(parameter(parameter_in = Query))]
pub ts: UnixMillis,
#[salvo(parameter(parameter_in = Query))]
pub dir: Direction,
}
#[derive(ToSchema, Serialize, Debug)]
pub struct EventByTimestampResBody {
pub event_id: OwnedEventId,
pub origin_server_ts: UnixMillis,
}
#[derive(ToSchema, Serialize, Debug)]
pub struct RoomEventResBody(
pub RawJson<AnyTimelineEvent>,
);
impl RoomEventResBody {
pub fn new(event: RawJson<AnyTimelineEvent>) -> Self {
Self(event)
}
}
#[derive(ToParameters, Deserialize, Debug)]
pub struct ReportContentReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub room_id: OwnedRoomId,
#[salvo(parameter(parameter_in = Path))]
pub event_id: OwnedEventId,
}
#[derive(ToSchema, Deserialize, Debug)]
pub struct ReportContentReqBody {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub score: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(ToSchema, Deserialize, Debug)]
pub struct SetReadMarkerReqBody {
#[serde(default, rename = "m.fully_read", skip_serializing_if = "Option::is_none")]
pub fully_read: Option<OwnedEventId>,
#[serde(default, rename = "m.read", skip_serializing_if = "Option::is_none")]
pub read_receipt: Option<OwnedEventId>,
#[serde(default, rename = "m.read.private", skip_serializing_if = "Option::is_none")]
pub private_read_receipt: Option<OwnedEventId>,
}
#[derive(ToParameters, Deserialize, Debug)]
pub struct ContextReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub room_id: OwnedRoomId,
#[salvo(parameter(parameter_in = Path))]
pub event_id: OwnedEventId,
#[salvo(parameter(parameter_in = Query))]
#[serde(default = "default_limit", skip_serializing_if = "is_default_limit")]
pub limit: usize,
#[salvo(parameter(parameter_in = Query))]
#[serde(
with = "crate::serde::json_string",
default,
skip_serializing_if = "RoomEventFilter::is_empty"
)]
pub filter: RoomEventFilter,
}
fn default_limit() -> usize {
10
}
#[derive(ToSchema, Serialize, Default, Debug)]
pub struct ContextResBody {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub start: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub end: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
#[salvo(schema(value_type = Object, additional_properties = true))]
pub events_before: Vec<RawJson<AnyTimelineEvent>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[salvo(schema(value_type = Object, additional_properties = true))]
pub event: Option<RawJson<AnyTimelineEvent>>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
#[salvo(schema(value_type = Object, additional_properties = true))]
pub events_after: Vec<RawJson<AnyTimelineEvent>>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
#[salvo(schema(value_type = Object, additional_properties = true))]
pub state: Vec<RawJson<AnyStateEvent>>,
}
impl ContextResBody {
pub fn new() -> Self {
Default::default()
}
}
#[derive(ToParameters, Deserialize, Debug)]
pub struct KnockReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub room_id_or_alias: OwnedRoomOrAliasId,
#[salvo(parameter(parameter_in = Query))]
#[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub server_name: Vec<OwnedServerName>,
}
#[derive(ToSchema, Deserialize, Debug)]
pub struct KnockReqBody {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[serde(default)]
pub via: Vec<OwnedServerName>,
}
#[derive(ToSchema, Serialize, Debug)]
pub struct KnockResBody {
pub room_id: OwnedRoomId,
}
impl KnockResBody {
pub fn new(room_id: OwnedRoomId) -> Self {
Self { room_id }
}
}