use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub id: String,
pub conversation_id: String,
pub sender_id: String,
pub content: Option<String>,
pub message_type: String,
pub status: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub reply_to_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub execute_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub complete_at: Option<String>,
pub created_at: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_at: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct SendMessageRequest {
pub conversation_id: String,
pub content: String,
pub message_type: String, #[serde(skip_serializing_if = "Option::is_none")]
pub reply_to_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MessagesResponse {
pub messages: Vec<Message>,
pub total: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SyncMessageHistoryData {
pub conversation_id: String,
pub messages: Vec<Message>,
pub has_more: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub next_page: Option<i32>,
pub sync_id: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NewMessageData {
pub conversation_id: String,
pub message: Message,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_send_message_request_serialization() {
let request = SendMessageRequest {
conversation_id: "660f9511-f3ac-52e5-b827-557766551111".to_string(),
content: "你好,这是一条测试消息".to_string(),
message_type: "text".to_string(),
reply_to_id: None,
data: None,
};
let json = serde_json::to_string(&request).unwrap();
println!("Serialized JSON: {}", json);
assert!(json.contains("\"message_type\":\"text\""), "字段名应该是 message_type,不是 type");
assert!(!json.contains("\"type\":"), "不应该包含 type 字段");
assert!(json.contains("\"conversation_id\":\"660f9511-f3ac-52e5-b827-557766551111\""));
assert!(json.contains("\"content\":\"你好,这是一条测试消息\""));
let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
assert_eq!(parsed["conversation_id"], "660f9511-f3ac-52e5-b827-557766551111");
assert_eq!(parsed["content"], "你好,这是一条测试消息");
assert_eq!(parsed["message_type"], "text");
}
}