diff --git a/src/client_types/chat_message.rs b/src/client_types/chat_message.rs new file mode 100644 index 0000000..b9ae15a --- /dev/null +++ b/src/client_types/chat_message.rs @@ -0,0 +1,76 @@ +use serde::{Serialize, Deserialize}; + +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, PartialOrd, Ord, Default)] +pub struct TimeSensitiveAction { + pub by: u32, + pub time: i64, +} +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, PartialOrd, Ord, Default)] +pub enum MessageContentType { + #[default] + Text, + Image, + Audio, + Video +} +#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, PartialOrd, Ord, Default)] +pub struct ChatMessage { + pub id: u32, + /// User id + #[serde(rename = "fromId")] + pub from_id: u32, + /// ChatRoom id (Not a user id) + #[serde(rename = "toId")] + pub to_id: u32, + pub message: Vec, + pub message_content: MessageContentType, + /// This must always be there. Since its created. + #[serde(rename = "timeSent")] + pub time_sent: i64, + /// This is a Vec because there can be many recipients. + #[serde(rename = "timeDelivered")] + pub time_delivered: Vec, + /// This is a Vec because there can be many recipients. + #[serde(rename = "timeSeen")] + pub time_seen: Vec, +} + +impl From for TimeSensitiveAction { + fn from(value: crate::domain::chat_message::TimeSensitiveAction) -> Self { + Self { + by: value.by, + time: value.time.timestamp_millis(), + } + } +} + +impl From for MessageContentType { + fn from(value: crate::domain::chat_message::ChatMessageContent) -> Self { + match value { + crate::domain::chat_message::ChatMessageContent::Text(_) => MessageContentType::Text, + crate::domain::chat_message::ChatMessageContent::Image(_) => MessageContentType::Image, + crate::domain::chat_message::ChatMessageContent::Video(_) => MessageContentType::Video, + crate::domain::chat_message::ChatMessageContent::Audio(_) => MessageContentType::Audio, + } + } +} + +impl From for ChatMessage { + fn from(value: crate::domain::chat_message::ChatMessage) -> Self { + Self { + id: value.id, + from_id: value.from_id, + to_id: value.to_id, + message: match value.message.clone() { + crate::domain::chat_message::ChatMessageContent::Text(text) => text.as_bytes().to_vec(), + crate::domain::chat_message::ChatMessageContent::Image(bytes) => bytes, + crate::domain::chat_message::ChatMessageContent::Video(bytes) => bytes, + crate::domain::chat_message::ChatMessageContent::Audio(bytes) => bytes, + }, + message_content: value.message.into(), + time_sent: value.time_sent.timestamp_millis(), + time_delivered: value.time_delivered.list.into_iter().map(|time_delivered| time_delivered.into()).collect(), + time_seen: value.time_seen.list.into_iter().map(|time_seen| time_seen.into()).collect(), + } + } +} \ No newline at end of file diff --git a/src/client_types/chat_room.rs b/src/client_types/chat_room.rs new file mode 100644 index 0000000..e69de29 diff --git a/src/client_types/mod.rs b/src/client_types/mod.rs new file mode 100644 index 0000000..2ea32b4 --- /dev/null +++ b/src/client_types/mod.rs @@ -0,0 +1,2 @@ +pub mod chat_message; +pub mod chat_room; \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 39113e4..2415f45 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ pub mod domain; -pub mod dto; \ No newline at end of file +pub mod dto; +pub mod client_types; \ No newline at end of file