(userID, chatJID, senderJID, messageID, messageType, textContent, mediaLink, quotedMessageID, dataJson string)
| 121 | return db, nil |
| 122 | } |
| 123 | |
| 124 | type HistoryMessage struct { |
| 125 | ID int `json:"id" db:"id"` |
| 126 | UserID string `json:"user_id" db:"user_id"` |
| 127 | ChatJID string `json:"chat_jid" db:"chat_jid"` |
| 128 | SenderJID string `json:"sender_jid" db:"sender_jid"` |
| 129 | MessageID string `json:"message_id" db:"message_id"` |
| 130 | Timestamp time.Time `json:"timestamp" db:"timestamp"` |
| 131 | MessageType string `json:"message_type" db:"message_type"` |
| 132 | TextContent string `json:"text_content" db:"text_content"` |
| 133 | MediaLink string `json:"media_link" db:"media_link"` |
| 134 | QuotedMessageID string `json:"quoted_message_id,omitempty" db:"quoted_message_id"` |
| 135 | DataJson string `json:"data_json" db:"datajson"` |
| 136 | } |
| 137 | |
| 138 | func (s *server) saveMessageToHistory(userID, chatJID, senderJID, messageID, messageType, textContent, mediaLink, quotedMessageID, dataJson string) error { |
| 139 | // Idempotent insert: HistorySync batches (and reconnects) routinely redeliver |
| 140 | // messages already persisted via the live Message event. The (user_id, message_id) |
| 141 | // unique constraint makes those duplicates an expected condition, not an error, |
| 142 | // so skip them silently instead of failing the insert and logging at ERROR. See #292. |
no outgoing calls