sending chat history on request work in progress
This commit is contained in:
parent
495b409adf
commit
d2985c3be8
2 changed files with 31 additions and 8 deletions
|
@ -4,6 +4,7 @@ pub mod s {
|
||||||
#[derive(Debug, serde::Serialize, serde::Deserialize)]
|
#[derive(Debug, serde::Serialize, serde::Deserialize)]
|
||||||
pub enum Packet {
|
pub enum Packet {
|
||||||
Message(crate::messages::Model),
|
Message(crate::messages::Model),
|
||||||
|
RequestChatHistory(uuid::Uuid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +14,7 @@ pub mod c {
|
||||||
#[derive(Debug, serde::Serialize, serde::Deserialize)]
|
#[derive(Debug, serde::Serialize, serde::Deserialize)]
|
||||||
pub enum Packet {
|
pub enum Packet {
|
||||||
Message(crate::messages::Model),
|
Message(crate::messages::Model),
|
||||||
|
MessagesHistory(Vec<crate::messages::Model>),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use futures_util::FutureExt;
|
use futures_util::FutureExt;
|
||||||
use scct_model::{chats, proto::c2s, users};
|
use scct_model::{chats, messages, proto::c2s, users};
|
||||||
use sea_orm::{ActiveModelTrait, ConnectionTrait, DatabaseConnection, IntoActiveModel};
|
use sea_orm::{ActiveModelTrait, ConnectionTrait, DatabaseConnection, EntityTrait, IntoActiveModel, ColumnTrait, QueryFilter, QueryOrder};
|
||||||
use tokio::sync::Mutex;
|
use tokio::sync::Mutex;
|
||||||
use transport::{Transport, TransportSink, TransportStream};
|
use transport::{Transport, TransportSink, TransportStream};
|
||||||
use uuid;
|
use uuid;
|
||||||
|
@ -17,11 +17,17 @@ pub async fn serve(addr: &str, db_connection: DatabaseConnection) -> Result<(),
|
||||||
tracing::info!("preparing C2S transport");
|
tracing::info!("preparing C2S transport");
|
||||||
let mut listener = c2s.serve(addr.to_string()).await?;
|
let mut listener = c2s.serve(addr.to_string()).await?;
|
||||||
|
|
||||||
|
// create the development chat if not exists
|
||||||
|
if let Ok(None) = chats::Entity::find_by_id(uuid::Uuid::nil()).one(&db_connection).await {
|
||||||
let chat = chats::Model {
|
let chat = chats::Model {
|
||||||
id: uuid::Uuid::nil(), // temporarily we have only one chat
|
id: uuid::Uuid::nil(), // temporarily we have only one chat
|
||||||
name: String::from("global")
|
name: String::from("global")
|
||||||
};
|
};
|
||||||
chat.clone().into_active_model().insert(&db_connection).await.expect("failed to create global chat");
|
match chat.clone().into_active_model().insert(&db_connection).await {
|
||||||
|
Ok(_) => {},
|
||||||
|
Err(_) => {},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
tracing::info!("listening for connections");
|
tracing::info!("listening for connections");
|
||||||
while let Some((tx, rx)) = listener.recv().await {
|
while let Some((tx, rx)) = listener.recv().await {
|
||||||
|
@ -82,6 +88,21 @@ async fn handle(active_client_peers: Arc<Mutex<Vec<impl TransportSink>>>, mut rx
|
||||||
active_client_peers.lock().await.remove(i);
|
active_client_peers.lock().await.remove(i);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
c2s::s::Packet::RequestChatHistory(chat_uuid) => {
|
||||||
|
// send the user all messages in the history of this chat
|
||||||
|
match messages::Entity::find()
|
||||||
|
.filter(messages::Column::ChatId.eq(chat_uuid))
|
||||||
|
.order_by_asc(messages::Column::Created)
|
||||||
|
.all(&db_connection)
|
||||||
|
.await {
|
||||||
|
Err(_) => { tracing::error!("failed to query all previously sent messages"); }
|
||||||
|
Ok(messages) => {
|
||||||
|
tracing::info!("responding to RequestChatHistory: {}", serde_json::to_string(&messages).unwrap());
|
||||||
|
// how do i know which TransportSink is the sink of the handlee? (which tx is me?)
|
||||||
|
todo!();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue