websocket for sending chat messages.
This commit is contained in:
BIN
db/1.sqlite
BIN
db/1.sqlite
Binary file not shown.
@@ -2,12 +2,15 @@
|
|||||||
use axum::{
|
use axum::{
|
||||||
extract::{
|
extract::{
|
||||||
FromRequest,FromRequestParts, State,
|
FromRequest,FromRequestParts, State,
|
||||||
}, http::StatusCode, response::{sse::KeepAlive, IntoResponse}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
}, http::StatusCode, response::{sse::KeepAlive, IntoResponse},
|
||||||
|
|
||||||
|
};
|
||||||
|
//use axum::extract::ws::Message;
|
||||||
use chrono::NaiveDateTime;
|
use chrono::NaiveDateTime;
|
||||||
use rusqlite::params;
|
use rusqlite::params;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
use serde_json::json;
|
||||||
|
|
||||||
use crate::chat::extractor::{
|
use crate::chat::extractor::{
|
||||||
AddUserConversationPayload, CreateConversationPayload, GetMessagesPayload, SendMessagePayload
|
AddUserConversationPayload, CreateConversationPayload, GetMessagesPayload, SendMessagePayload
|
||||||
@@ -112,10 +115,11 @@ pub async fn send_message(
|
|||||||
};
|
};
|
||||||
|
|
||||||
if !statement.exists(params![user_id, payload.conv_id])
|
if !statement.exists(params![user_id, payload.conv_id])
|
||||||
.map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "Query failed".to_string())).unwrap()
|
.map_err(|_| (StatusCode::INTERNAL_SERVER_ERROR, "Query failed".to_string()))
|
||||||
|
.unwrap()
|
||||||
{
|
{
|
||||||
// Early exit if not creator
|
// Early exit if not creator
|
||||||
return ((StatusCode::FORBIDDEN, "Not the creator".to_string()));
|
return ((StatusCode::FORBIDDEN, "Not part of the conversation".to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
let result = conn.execute(
|
let result = conn.execute(
|
||||||
@@ -123,21 +127,57 @@ pub async fn send_message(
|
|||||||
params![&user_id, &payload.message, &payload.conv_id],
|
params![&user_id, &payload.message, &payload.conv_id],
|
||||||
);
|
);
|
||||||
|
|
||||||
|
match result {
|
||||||
|
Ok(rows) if rows > 0 => {
|
||||||
|
// --- send to conversation participants ---
|
||||||
|
let mut stmt_participants = conn
|
||||||
|
.prepare("SELECT user_id FROM conversation_participants WHERE conversation_id = ?1")
|
||||||
|
.expect("prepare participants failed");
|
||||||
|
|
||||||
|
let participant_ids: Vec<i32> = stmt_participants
|
||||||
|
.query_map(params![payload.conv_id], |row| row.get(0))
|
||||||
|
.expect("query_map failed")
|
||||||
|
.filter_map(Result::ok)
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
if let Some(hotel_users) = state.ws_map.get(&hotel_id) {
|
||||||
|
let update_msg = serde_json::json!({
|
||||||
|
"conv_id": payload.conv_id,
|
||||||
|
"sender": user_id,
|
||||||
|
"content": payload.message,
|
||||||
|
})
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
for uid in &participant_ids {
|
||||||
|
if let Some(sender) = hotel_users.get(&uid) {
|
||||||
|
let _ = sender.send(axum::extract::ws::Message::Text(update_msg.clone().into()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
(StatusCode::OK, format!("sent message: {}, to users:{:?}", payload.message, participant_ids))
|
||||||
|
}
|
||||||
|
Ok(_) => (StatusCode::NOT_FOUND, "Conversation not found".to_string()),
|
||||||
|
Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, format!("Error from DB: {err}")),
|
||||||
|
}
|
||||||
|
/*
|
||||||
match result {
|
match result {
|
||||||
Ok(rows) if rows > 0 => (StatusCode::OK, "added message succesfully".to_string()),
|
Ok(rows) if rows > 0 => (StatusCode::OK, "added message succesfully".to_string()),
|
||||||
Ok(_) => (StatusCode::NOT_FOUND, "not able to add the message, conversation may not exist".to_string() ),
|
Ok(_) => (StatusCode::NOT_FOUND, "not able to add the message, conversation may not exist".to_string() ),
|
||||||
Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, format!("Error when adding the message : {err}")),
|
Err(err) => (StatusCode::INTERNAL_SERVER_ERROR, format!("Error when adding the message : {err}")),
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize)]
|
#[derive(Debug, Serialize)]
|
||||||
struct Message {
|
struct Message {
|
||||||
id: i32,
|
id: i32,
|
||||||
sender_id: i32,
|
sender_id: i32,
|
||||||
content: String,
|
content: String,
|
||||||
sent_at: String,
|
sent_at: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
pub async fn get_message(
|
pub async fn get_message(
|
||||||
|
|||||||
Reference in New Issue
Block a user