Added servermessagin and out to chat types along with socketerror
This commit is contained in:
parent
8b742e5902
commit
23a93418d0
|
@ -171,6 +171,7 @@ name = "chat-types"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
|
"dev-dtos",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"sqlx",
|
"sqlx",
|
||||||
|
@ -332,6 +333,15 @@ dependencies = [
|
||||||
"pem-rfc7468",
|
"pem-rfc7468",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "dev-dtos"
|
||||||
|
version = "0.1.0"
|
||||||
|
source = "git+https://git.franklinblanco.dev/franklinblanco/user-svc-dtos-rust.git#400f705ead30467cadc96d7aef6a3163f323df45"
|
||||||
|
dependencies = [
|
||||||
|
"chrono",
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "digest"
|
name = "digest"
|
||||||
version = "0.10.6"
|
version = "0.10.6"
|
||||||
|
|
|
@ -10,3 +10,5 @@ serde = { version = "1.0", features = ["derive"] }
|
||||||
chrono = { version = "0.4", features = [ "serde" ] }
|
chrono = { version = "0.4", features = [ "serde" ] }
|
||||||
sqlx = { version = "0.6.0", features = [ "runtime-tokio-rustls", "mysql", "chrono", "decimal", "offline" ] }
|
sqlx = { version = "0.6.0", features = [ "runtime-tokio-rustls", "mysql", "chrono", "decimal", "offline" ] }
|
||||||
serde_json = { version = "1" }
|
serde_json = { version = "1" }
|
||||||
|
|
||||||
|
dev-dtos = { git = "https://git.franklinblanco.dev/franklinblanco/user-svc-dtos-rust.git" }
|
|
@ -0,0 +1,24 @@
|
||||||
|
use std::{error::Error, fmt::Display};
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Default, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub struct SocketError {
|
||||||
|
pub message: String,
|
||||||
|
}
|
||||||
|
impl SocketError {
|
||||||
|
pub fn boxed_error(message: impl ToString) -> Box<Self> {
|
||||||
|
Box::new(Self {
|
||||||
|
message: message.to_string(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Display for SocketError {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
write!(f, "{}", self.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Error for SocketError {}
|
||||||
|
|
||||||
|
pub const MUTEX_LOCK_ERROR_MESSAGE: &str = "Fatal Error, mutex was attempted to be aqcuired while another thread had it and panicked while it was locked.";
|
|
@ -2,3 +2,4 @@ pub mod chat_message;
|
||||||
pub mod chat_message_update;
|
pub mod chat_message_update;
|
||||||
pub mod chat_room;
|
pub mod chat_room;
|
||||||
pub mod chat_user;
|
pub mod chat_user;
|
||||||
|
pub mod error;
|
|
@ -1,2 +1,4 @@
|
||||||
pub mod chat;
|
pub mod chat;
|
||||||
pub mod message;
|
pub mod message;
|
||||||
|
pub mod server_out;
|
||||||
|
pub mod server_in;
|
|
@ -0,0 +1,66 @@
|
||||||
|
use std::fmt::Display;
|
||||||
|
|
||||||
|
use crate::{domain::{chat_message::ChatMessageSender, error::SocketError}, dto::message::ClientMessage};
|
||||||
|
use dev_dtos::dtos::user::user_dtos::UserForAuthenticationDto;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
|
||||||
|
pub trait Receivable {
|
||||||
|
fn from_message(
|
||||||
|
message: ClientMessage,
|
||||||
|
) -> Result<Self, Box<dyn std::error::Error + Send + Sync>>
|
||||||
|
where
|
||||||
|
Self: Sized;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Message that can be recieved from the client to a connected socket
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub enum ServerMessageIn {
|
||||||
|
Login(UserForAuthenticationDto),
|
||||||
|
Logout,
|
||||||
|
|
||||||
|
/// A list of MessageId's that the client reports to see
|
||||||
|
SeeMessages(Vec<u32>),
|
||||||
|
SendMessage(ChatMessageSender),
|
||||||
|
|
||||||
|
/// Client can send this to server to fetch old messages.
|
||||||
|
/// By Old messages I mean: Messages that have already been delivered/seen
|
||||||
|
FetchMessages(),
|
||||||
|
|
||||||
|
JoinGroup(),
|
||||||
|
LeaveGroup(),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for ServerMessageIn {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
match self {
|
||||||
|
ServerMessageIn::Login(_) => write!(f, "LOGIN"),
|
||||||
|
ServerMessageIn::Logout => write!(f, "LOGOUT"),
|
||||||
|
ServerMessageIn::SeeMessages(_) => write!(f, "SEE MESSAGES"),
|
||||||
|
ServerMessageIn::SendMessage(_) => write!(f, "SEND MESSAGE"),
|
||||||
|
ServerMessageIn::JoinGroup() => write!(f, "JOIN GROUP"),
|
||||||
|
ServerMessageIn::LeaveGroup() => write!(f, "LEAVE GROUP"),
|
||||||
|
ServerMessageIn::FetchMessages() => write!(f, "FETCH MESSAGES"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Receivable for ServerMessageIn {
|
||||||
|
fn from_message(
|
||||||
|
message: ClientMessage,
|
||||||
|
) -> Result<Self, Box<dyn std::error::Error + Send + Sync>> {
|
||||||
|
match message.head.as_str() {
|
||||||
|
"LOGIN" => Ok(Self::Login(serde_json::from_value(message.body)?)),
|
||||||
|
"LOGOUT" => Ok(Self::Logout),
|
||||||
|
"SEE MESSAGES" => Ok(Self::SeeMessages(serde_json::from_value(message.body)?)),
|
||||||
|
"SEND MESSAGE" => Ok(Self::SendMessage(serde_json::from_value(message.body)?)),
|
||||||
|
"JOIN GROUP" => Ok(Self::JoinGroup()),
|
||||||
|
"LEAVE GROUP" => Ok(Self::LeaveGroup()),
|
||||||
|
"FETCH MESSAGES" => Ok(Self::FetchMessages()),
|
||||||
|
_ => Err(SocketError::boxed_error(format!(
|
||||||
|
"ClientMessage recieved isn't recognized by the server. ClientMessage: {:#?}",
|
||||||
|
message
|
||||||
|
))),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,83 @@
|
||||||
|
use crate::{domain::chat_message::{ChatMessage, TimeSensitiveAction}, dto::message::ClientMessage};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use serde_json::Value;
|
||||||
|
use std::fmt::Display;
|
||||||
|
pub trait Sendable {
|
||||||
|
fn into_message(self) -> Result<ClientMessage, Box<dyn std::error::Error + Send + Sync>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Message sent from Server to client
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub enum ServerMessageOut {
|
||||||
|
Acknowledge,
|
||||||
|
LoggedIn,
|
||||||
|
|
||||||
|
/// Whenever a user sends a message
|
||||||
|
MessageSent,
|
||||||
|
/// Whenever a user gets a message
|
||||||
|
MessageRecieved(ChatMessage),
|
||||||
|
/// Whenever a message sent by the user gets delivered along with the MessageId
|
||||||
|
MessageDelivered(ChatMessage),
|
||||||
|
/// Whenever a message sent by the user gets seen along with the MessageId
|
||||||
|
MessageSeen(ChatMessage),
|
||||||
|
|
||||||
|
Error(String),
|
||||||
|
}
|
||||||
|
/// Used as a dto to notify the client that a specific message has been seen or delivered
|
||||||
|
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
pub struct MessageTimeChangeUpdate {
|
||||||
|
#[serde(rename = "timeUpdate")]
|
||||||
|
pub time_update: TimeSensitiveAction,
|
||||||
|
#[serde(rename = "chatMessageId")]
|
||||||
|
pub chat_message_id: u128,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for ServerMessageOut {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
match self {
|
||||||
|
ServerMessageOut::Acknowledge => write!(f, "ACKNOWLEDGE"),
|
||||||
|
ServerMessageOut::LoggedIn => write!(f, "LOGGED IN"),
|
||||||
|
ServerMessageOut::MessageSent => write!(f, "MESSAGE SENT"),
|
||||||
|
ServerMessageOut::MessageRecieved(_) => write!(f, "MESSAGE RECIEVED"),
|
||||||
|
ServerMessageOut::MessageDelivered(_) => write!(f, "MESSAGE DELIVERED"),
|
||||||
|
ServerMessageOut::MessageSeen(_) => write!(f, "MESSAGE SEEN"),
|
||||||
|
ServerMessageOut::Error(_) => write!(f, "ERROR"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Sendable for ServerMessageOut {
|
||||||
|
fn into_message(self) -> Result<ClientMessage, Box<(dyn std::error::Error + Send + Sync)>> {
|
||||||
|
let head = self.to_string();
|
||||||
|
match self {
|
||||||
|
ServerMessageOut::Acknowledge => Ok(ClientMessage {
|
||||||
|
head,
|
||||||
|
body: Value::Null,
|
||||||
|
}),
|
||||||
|
ServerMessageOut::LoggedIn => Ok(ClientMessage {
|
||||||
|
head,
|
||||||
|
body: Value::Null,
|
||||||
|
}),
|
||||||
|
ServerMessageOut::MessageSent => Ok(ClientMessage {
|
||||||
|
head,
|
||||||
|
body: Value::Null,
|
||||||
|
}),
|
||||||
|
ServerMessageOut::MessageRecieved(chat_message) => Ok(ClientMessage {
|
||||||
|
head,
|
||||||
|
body: serde_json::to_value(chat_message)?,
|
||||||
|
}),
|
||||||
|
ServerMessageOut::MessageDelivered(delivered_info) => Ok(ClientMessage {
|
||||||
|
head,
|
||||||
|
body: serde_json::to_value(delivered_info)?,
|
||||||
|
}),
|
||||||
|
ServerMessageOut::MessageSeen(seen_info) => Ok(ClientMessage {
|
||||||
|
head,
|
||||||
|
body: serde_json::to_value(seen_info)?,
|
||||||
|
}),
|
||||||
|
ServerMessageOut::Error(error) => Ok(ClientMessage {
|
||||||
|
head,
|
||||||
|
body: serde_json::to_value(error)?,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue