use salvo::prelude::*;
use serde::{Deserialize, Serialize};
use crate::client::filter::RoomEventFilter;
use crate::events::{AnyStateEvent, AnyTimelineEvent, MessageLikeEventType};
use crate::{Direction, OwnedEventId, OwnedRoomId, OwnedTransactionId, UnixMillis, serde::RawJson};
#[derive(ToParameters, Deserialize, Debug)]
pub struct MessagesReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub room_id: OwnedRoomId,
#[serde(default)]
#[salvo(parameter(parameter_in = Query))]
pub from: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
#[salvo(parameter(parameter_in = Query))]
pub to: Option<String>,
#[serde(default)]
#[salvo(parameter(parameter_in = Query))]
pub dir: Direction,
#[serde(default = "default_limit", skip_serializing_if = "is_default_limit")]
#[salvo(parameter(parameter_in = Query))]
pub limit: usize,
#[serde(
with = "crate::serde::json_string",
default,
skip_serializing_if = "RoomEventFilter::is_empty"
)]
#[salvo(parameter(parameter_in = Query))]
pub filter: RoomEventFilter,
}
#[derive(ToSchema, Default, Serialize, Debug)]
pub struct MessagesResBody {
pub start: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub end: Option<String>,
#[serde(default)]
#[salvo(schema(value_type = Object, additional_properties = true))]
pub chunk: Vec<RawJson<AnyTimelineEvent>>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
#[salvo(schema(value_type = Object, additional_properties = true))]
pub state: Vec<RawJson<AnyStateEvent>>,
}
fn default_limit() -> usize {
10
}
#[allow(clippy::trivially_copy_pass_by_ref)]
fn is_default_limit(val: &usize) -> bool {
*val == default_limit()
}
#[derive(ToParameters, Deserialize, Debug)]
pub struct CreateMessageWithTxnReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub room_id: OwnedRoomId,
#[salvo(parameter(parameter_in = Path))]
pub event_type: MessageLikeEventType,
#[salvo(parameter(parameter_in = Path))]
pub txn_id: OwnedTransactionId,
#[salvo(parameter(parameter_in = Query))]
#[serde(skip_serializing_if = "Option::is_none", rename = "ts")]
pub timestamp: Option<UnixMillis>,
}
#[derive(ToParameters, Deserialize, Debug)]
pub struct CreateMessageReqArgs {
#[salvo(parameter(parameter_in = Path))]
pub room_id: OwnedRoomId,
#[salvo(parameter(parameter_in = Path))]
pub event_type: MessageLikeEventType,
#[salvo(parameter(parameter_in = Query))]
#[serde(skip_serializing_if = "Option::is_none", rename = "ts")]
pub timestamp: Option<UnixMillis>,
}
#[derive(ToSchema, Serialize, Debug)]
pub struct SendMessageResBody {
pub event_id: OwnedEventId,
}
impl SendMessageResBody {
pub fn new(event_id: OwnedEventId) -> Self {
Self { event_id }
}
}