1use super::HingeClient;
2use crate::errors::HingeError;
3use crate::models::SendMessagePayload;
4use crate::storage::Storage;
5use uuid::Uuid;
6
7impl<S: Storage + Clone> HingeClient<S> {
8 pub async fn send_message(
9 &self,
10 mut payload: SendMessagePayload,
11 ) -> Result<serde_json::Value, HingeError> {
12 let mut cloned = self.clone();
13 let self_user_id = cloned
14 .hinge_auth
15 .as_ref()
16 .ok_or_else(|| HingeError::Auth("hinge token missing".into()))?
17 .identity_id
18 .clone();
19 let _channel_url = cloned
20 .sendbird_get_or_create_dm_channel(&self_user_id, &payload.subject_id)
21 .await
22 .unwrap_or_else(|e| {
23 log::warn!("sendbird get-or-create failed before send: {}", e);
24 String::new()
25 });
26
27 if payload.dedup_id.is_none() {
28 payload.dedup_id = Some(Uuid::new_v4().to_string().to_uppercase());
29 }
30
31 let url = format!("{}/message/send", self.settings.base_url);
32 let body = serde_json::to_value(&payload).map_err(|e| HingeError::Serde(e.to_string()))?;
33 let res = self.http_post(&url, &body).await?;
34 self.parse_response(res).await
35 }
36}