Skip to main content

mail4agent_server/
events.rs

1//! Format one stored event the way a Client-Server response carries it.
2
3use crate::error::MatrixError;
4use crate::store::{self, MatrixEvent};
5
6pub fn client_event_json(
7    conn: &rusqlite::Connection,
8    event: &MatrixEvent,
9    own_txn_id: Option<&str>,
10) -> Result<serde_json::Value, MatrixError> {
11    let sender = store::mxid_of(conn, event.sender_user_id)?.ok_or_else(|| {
12        tracing::error!("client_event_json: sender {} has no matrix_users row", event.sender_user_id);
13        MatrixError::internal()
14    })?;
15    let content: serde_json::Value = serde_json::from_str(&event.content).unwrap_or_else(|_| serde_json::json!({}));
16    let now_ms = chrono::Utc::now().timestamp_millis();
17    let age = (now_ms - event.origin_server_ts).max(0);
18
19    let mut unsigned = serde_json::json!({ "age": age });
20    if let Some(redaction_event_id) = &event.redacted_by {
21        if let Some(redaction_event) = store::get_event(conn, redaction_event_id)? {
22            unsigned["redacted_because"] = client_event_json(conn, &redaction_event, None)?;
23        }
24    }
25    if event.event_type == "m.room.member" {
26        if let Ok(member_content) = serde_json::from_str::<serde_json::Value>(&event.content) {
27            if member_content.get("membership").and_then(|v| v.as_str()) == Some("invite") {
28                let stripped = store::stripped_invite_state(conn, &event.room_id, event.sender_user_id)?;
29                unsigned["invite_room_state"] = serde_json::Value::Array(stripped);
30            }
31        }
32    }
33    if let Some(txn_id) = own_txn_id {
34        unsigned["transaction_id"] = serde_json::Value::String(txn_id.to_string());
35    }
36
37    let mut value = serde_json::json!({
38        "event_id": event.event_id,
39        "type": event.event_type,
40        "sender": sender,
41        "origin_server_ts": event.origin_server_ts,
42        "content": content,
43        "room_id": event.room_id,
44        "unsigned": unsigned,
45    });
46    if let Some(state_key) = &event.state_key {
47        value["state_key"] = serde_json::Value::String(state_key.clone());
48    }
49    if let Some(redacts) = &event.redacts {
50        value["redacts"] = serde_json::Value::String(redacts.clone());
51    }
52    Ok(value)
53}