diff --git a/src/database/entities/channel.rs b/src/database/entities/channel.rs index 2e2cfcc75e96a3a366de0b6bc0d3852f80f0b734..63759f86cbb781cd6fb58d41e183de508e7c1c03 100644 --- a/src/database/entities/channel.rs +++ b/src/database/entities/channel.rs @@ -5,6 +5,14 @@ use mongodb::bson::{doc, to_document}; use rocket_contrib::json::JsonValue; use serde::{Deserialize, Serialize}; +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct LastMessage { + #[serde(rename = "_id")] + id: String, + author: String, + short: String, +} + #[derive(Serialize, Deserialize, Debug, Clone)] #[serde(tag = "channel_type")] pub enum Channel { @@ -18,6 +26,8 @@ pub enum Channel { id: String, active: bool, recipients: Vec<String>, + #[serde(skip_serializing_if = "Option::is_none")] + last_message: Option<LastMessage>, }, Group { #[serde(rename = "_id")] @@ -28,6 +38,8 @@ pub enum Channel { owner: String, description: String, recipients: Vec<String>, + #[serde(skip_serializing_if = "Option::is_none")] + last_message: Option<LastMessage>, }, } diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index f03e29d5289593eeb72018d28ab4a33dcb32c33d..e51efb5addbaf757d825d9287b28a029a6fc6b72 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -35,18 +35,60 @@ impl Message { } } - pub async fn publish(self) -> Result<()> { + pub async fn publish(self, channel: &Channel) -> Result<()> { get_collection("messages") .insert_one(to_bson(&self).unwrap().as_document().unwrap().clone(), None) .await .map_err(|_| Error::DatabaseError { operation: "insert_one", - with: "messages", + with: "message", })?; - let channel = self.channel.clone(); + // ! temp code + let channels = get_collection("channels"); + match channel { + Channel::DirectMessage { id, .. } => { + channels.update_one( + doc! { "_id": id }, + doc! { + "active": true, + "last_message": { + "_id": self.id.clone(), + "author": self.author.clone(), + "short": self.content.chars().take(24).collect::<String>() + } + }, + None + ) + .await + .map_err(|_| Error::DatabaseError { + operation: "update_one", + with: "channel", + })?; + }, + Channel::Group { id, .. } => { + channels.update_one( + doc! { "_id": id }, + doc! { + "last_message": { + "_id": self.id.clone(), + "author": self.author.clone(), + "short": self.content.chars().take(24).collect::<String>() + } + }, + None + ) + .await + .map_err(|_| Error::DatabaseError { + operation: "update_one", + with: "channel", + })?; + }, + _ => {} + } + ClientboundNotification::Message(self) - .publish(channel) + .publish(channel.id().to_string()) .await .ok(); diff --git a/src/routes/channels/delete_channel.rs b/src/routes/channels/delete_channel.rs index b328b5d443c307123911ae1186ca0ba47a7eb4c5..0b8e30fd91a0e800ded9859aa66de93d5dd5ec28 100644 --- a/src/routes/channels/delete_channel.rs +++ b/src/routes/channels/delete_channel.rs @@ -101,7 +101,7 @@ pub async fn req(user: User, target: Ref) -> Result<()> { id.clone(), format!("<@{}> left the group.", user.id), ) - .publish() + .publish(&target) .await .ok(); diff --git a/src/routes/channels/group_add_member.rs b/src/routes/channels/group_add_member.rs index 677fdd85edb0cd5fc67c13fe5203c0bae4e036aa..cbb97564a4294d0838bd7b814b46d62cd4fc74e0 100644 --- a/src/routes/channels/group_add_member.rs +++ b/src/routes/channels/group_add_member.rs @@ -17,7 +17,7 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> { Err(Error::LabelMe)? } - if let Channel::Group { id, recipients, .. } = channel { + if let Channel::Group { id, recipients, .. } = &channel { if recipients.len() >= *MAX_GROUP_SIZE { Err(Error::GroupTooLarge { max: *MAX_GROUP_SIZE, @@ -56,10 +56,10 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> { Message::create( "00000000000000000000000000".to_string(), - id, + id.clone(), format!("<@{}> added <@{}> to the group.", user.id, member.id), ) - .publish() + .publish(&channel) .await .ok(); diff --git a/src/routes/channels/group_create.rs b/src/routes/channels/group_create.rs index 54075a67274f3010dea87fb2c29965f3a574ce3e..65d6a16af59b95446069883c6204a29adf67a23e 100644 --- a/src/routes/channels/group_create.rs +++ b/src/routes/channels/group_create.rs @@ -70,6 +70,7 @@ pub async fn req(user: User, info: Json<Data>) -> Result<JsonValue> { .unwrap_or_else(|| "A group.".to_string()), owner: user.id, recipients: set.into_iter().collect::<Vec<String>>(), + last_message: None }; channel.clone().publish().await?; diff --git a/src/routes/channels/group_remove_member.rs b/src/routes/channels/group_remove_member.rs index 438756d24c9eb035a96a888422e70a3426bfc7af..08bd4e31536c2e4684f6a2990b5e222ec0e41c1f 100644 --- a/src/routes/channels/group_remove_member.rs +++ b/src/routes/channels/group_remove_member.rs @@ -16,9 +16,9 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> { owner, recipients, .. - } = channel + } = &channel { - if &user.id != &owner { + if &user.id != owner { // figure out if we want to use perm system here Err(Error::LabelMe)? } @@ -55,10 +55,10 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> { Message::create( "00000000000000000000000000".to_string(), - id, + id.clone(), format!("<@{}> removed <@{}> from the group.", user.id, member.id), ) - .publish() + .publish(&channel) .await .ok(); diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs index ae06890f10feca85a2348a652b26938dcccc071d..71a0f938864790f53fe7a4de99ea7d5d1b605166 100644 --- a/src/routes/channels/message_send.rs +++ b/src/routes/channels/message_send.rs @@ -56,7 +56,7 @@ pub async fn req(user: User, target: Ref, message: Json<Data>) -> Result<JsonVal edited: None, }; - msg.clone().publish().await?; + msg.clone().publish(&target).await?; Ok(json!(msg)) } diff --git a/src/routes/users/open_dm.rs b/src/routes/users/open_dm.rs index 706653435c8c0b5bebb336f6d675d357dfde3a74..d36b6648ce3af3e03d13e92a4ce22334fd57626d 100644 --- a/src/routes/users/open_dm.rs +++ b/src/routes/users/open_dm.rs @@ -40,6 +40,7 @@ pub async fn req(user: User, target: Ref) -> Result<JsonValue> { id, active: false, recipients: vec![user.id, target.id], + last_message: None } };