Skip to main content

msg_gateway/
message.rs

1use serde::{Deserialize, Serialize};
2
3/// Normalized inbound message envelope (Gateway → Pipelit)
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct InboundMessage {
6    pub route: serde_json::Value,
7    pub credential_id: String,
8    pub source: MessageSource,
9    pub text: String,
10    #[serde(default, skip_serializing_if = "Vec::is_empty")]
11    pub attachments: Vec<Attachment>,
12    pub timestamp: chrono::DateTime<chrono::Utc>,
13    #[serde(default, skip_serializing_if = "Option::is_none")]
14    pub extra_data: Option<serde_json::Value>,
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct MessageSource {
19    pub protocol: String,
20    pub chat_id: String,
21    pub message_id: String,
22    #[serde(default, skip_serializing_if = "Option::is_none")]
23    pub reply_to_message_id: Option<String>,
24    pub from: UserInfo,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct UserInfo {
29    pub id: String,
30    #[serde(default, skip_serializing_if = "Option::is_none")]
31    pub username: Option<String>,
32    #[serde(default, skip_serializing_if = "Option::is_none")]
33    pub display_name: Option<String>,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
37pub struct Attachment {
38    pub filename: String,
39    pub mime_type: String,
40    pub size_bytes: u64,
41    /// Gateway-hosted download URL for successful files, or "error: ..." for failed downloads
42    pub download_url: String,
43}
44
45/// Outbound message (Pipelit → Gateway → Client)
46#[derive(Debug, Clone, Serialize, Deserialize)]
47#[allow(dead_code)]
48pub struct OutboundMessage {
49    pub credential_id: String,
50    pub chat_id: String,
51    #[serde(default, skip_serializing_if = "Option::is_none")]
52    pub reply_to_message_id: Option<String>,
53    pub text: String,
54    #[serde(default, skip_serializing_if = "Vec::is_empty")]
55    pub file_ids: Vec<String>,
56    #[serde(default, skip_serializing_if = "Option::is_none")]
57    pub extra_data: Option<serde_json::Value>,
58}
59
60/// Response after sending a message
61#[derive(Debug, Clone, Serialize, Deserialize)]
62#[allow(dead_code)]
63pub struct SendResponse {
64    pub status: String,
65    pub protocol_message_id: String,
66    pub timestamp: chrono::DateTime<chrono::Utc>,
67}
68
69/// WebSocket message pushed to clients
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct WsOutboundMessage {
72    pub text: String,
73    pub timestamp: chrono::DateTime<chrono::Utc>,
74    pub message_id: String,
75    #[serde(default, skip_serializing_if = "Vec::is_empty")]
76    pub file_urls: Vec<String>,
77}