diff --git a/src/database/entities/channel.rs b/src/database/entities/channel.rs index a1ba6c4a..a0c7ed1f 100644 --- a/src/database/entities/channel.rs +++ b/src/database/entities/channel.rs @@ -13,14 +13,6 @@ use mongodb::{ use rocket::serde::json::Value; 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 { @@ -36,7 +28,7 @@ pub enum Channel { active: bool, recipients: Vec, #[serde(skip_serializing_if = "Option::is_none")] - last_message: Option, + last_message_id: Option, }, Group { #[serde(rename = "_id")] @@ -53,7 +45,7 @@ pub enum Channel { #[serde(skip_serializing_if = "Option::is_none")] icon: Option, #[serde(skip_serializing_if = "Option::is_none")] - last_message: Option, + last_message_id: Option, #[serde(skip_serializing_if = "Option::is_none")] permissions: Option, @@ -75,7 +67,7 @@ pub enum Channel { #[serde(skip_serializing_if = "Option::is_none")] icon: Option, #[serde(skip_serializing_if = "Option::is_none")] - last_message: Option, + last_message_id: Option, #[serde(skip_serializing_if = "Option::is_none")] default_permissions: Option, diff --git a/src/database/entities/message.rs b/src/database/entities/message.rs index dcc36506..7305e8c5 100644 --- a/src/database/entities/message.rs +++ b/src/database/entities/message.rs @@ -8,7 +8,8 @@ use crate::{ use futures::StreamExt; use mongodb::options::UpdateOptions; use mongodb::{ - bson::{doc, to_bson, DateTime}, + bson::{doc, to_bson, DateTime, Document}, + options::FindOptions, }; use rauth::entities::{Model, Session}; use rocket::serde::json::Value; @@ -171,7 +172,6 @@ impl Message { nonce: None, channel, author, - content, attachments: None, edited: None, @@ -196,76 +196,19 @@ impl Message { let ss = self.clone(); let c_clone = channel.clone(); async_std::task::spawn(async move { - let mut set = if let Content::Text(text) = &ss.content { - doc! { - "last_message": { - "_id": ss.id.clone(), - "author": ss.author.clone(), - "short": text.chars().take(128).collect::() - } - } - } else { - doc! {} - }; - // ! MARK AS ACTIVE - // ! FIXME: temp code + let last_message_id = ss.id.clone(); + let mut set = doc! { "last_message_id": last_message_id }; + let channels = get_collection("channels"); match &c_clone { Channel::DirectMessage { id, .. } => { + // ! MARK AS ACTIVE set.insert("active", true); - channels - .update_one( - doc! { "_id": id }, - doc! { - "$set": set - }, - None, - ) - .await - /*.map_err(|_| Error::DatabaseError { - operation: "update_one", - with: "channel", - })?;*/ - .unwrap(); - } - Channel::Group { id, .. } => { - if let Content::Text(_) = &ss.content { - channels - .update_one( - doc! { "_id": id }, - doc! { - "$set": set - }, - None, - ) - .await - /*.map_err(|_| Error::DatabaseError { - operation: "update_one", - with: "channel", - })?;*/ - .unwrap(); - } - } - Channel::TextChannel { id, .. } => { - if let Content::Text(_) = &ss.content { - channels - .update_one( - doc! { "_id": id }, - doc! { - "$set": { - "last_message": &ss.id - } - }, - None, - ) - .await - /*.map_err(|_| Error::DatabaseError { - operation: "update_one", - with: "channel", - })?;*/ - .unwrap(); - } + update_channels_last_message(&channels, id, &set).await; + }, + Channel::Group { id, .. } | Channel::TextChannel { id, .. } => { + update_channels_last_message(&channels, id, &set).await; } _ => {} } @@ -490,3 +433,15 @@ impl Message { Ok(()) } } + +async fn update_channels_last_message(channels: &Collection, channel_id: &String, set: &Document) { + channels + .update_one( + doc! { "_id": channel_id }, + doc! { "$set": set }, + None, + ) + .await + .expect("Server should not run with no, or a corrupted db"); + +} diff --git a/src/routes/channels/group_create.rs b/src/routes/channels/group_create.rs index 7d0ce530..d70ebb05 100644 --- a/src/routes/channels/group_create.rs +++ b/src/routes/channels/group_create.rs @@ -78,7 +78,7 @@ pub async fn req(user: User, info: Json) -> Result { owner: user.id, recipients: set.into_iter().collect::>(), icon: None, - last_message: None, + last_message_id: None, permissions: None, nsfw: info.nsfw.unwrap_or_default() }; diff --git a/src/routes/servers/channel_create.rs b/src/routes/servers/channel_create.rs index 12520ed5..abfc4207 100644 --- a/src/routes/servers/channel_create.rs +++ b/src/routes/servers/channel_create.rs @@ -79,7 +79,7 @@ pub async fn req(user: User, target: Ref, info: Json) -> Result { name: info.name, description: info.description, icon: None, - last_message: None, + last_message_id: None, default_permissions: None, role_permissions: HashMap::new(), diff --git a/src/routes/servers/server_create.rs b/src/routes/servers/server_create.rs index 88c664ae..194b60a2 100644 --- a/src/routes/servers/server_create.rs +++ b/src/routes/servers/server_create.rs @@ -88,7 +88,7 @@ pub async fn req(user: User, info: Json) -> Result { description: None, icon: None, - last_message: None, + last_message_id: None, default_permissions: None, role_permissions: HashMap::new(), diff --git a/src/routes/users/open_dm.rs b/src/routes/users/open_dm.rs index 64bef6a2..18072ab1 100644 --- a/src/routes/users/open_dm.rs +++ b/src/routes/users/open_dm.rs @@ -40,7 +40,7 @@ pub async fn req(user: User, target: Ref) -> Result { id, active: false, recipients: vec![user.id, target.id], - last_message: None, + last_message_id: None, } };