use salvo::prelude::*;
use serde::{Deserialize, Serialize};
use crate::client::filter::RoomEventFilter;
use crate::events::{AnyStateEvent, AnyTimelineEvent};
use crate::serde::RawJson;
use crate::{Direction, OwnedEventId, OwnedRoomId, OwnedRoomOrAliasId, OwnedServerName, UnixMillis};
#[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 {
#[salvo(schema(value_type = Object, additional_properties = true))]
pub event: RawJson<AnyTimelineEvent>,
}
impl RoomEventResBody {
pub fn new(event: RawJson<AnyTimelineEvent>) -> Self {
Self { event }
}
}
#[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(skip_serializing_if = "Option::is_none")]
pub start: Option<String>,
#[serde(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(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,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[salvo(parameter(parameter_in = Query))]
#[serde(default, skip_serializing_if = "<[_]>::is_empty")]
pub server_name: 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 }
}
}