Merge pull request #67 from yannickfunk/unify-last-message

This commit is contained in:
Paul Makles
2021-09-14 13:39:27 +01:00
committed by GitHub
6 changed files with 29 additions and 82 deletions

View File

@@ -13,14 +13,6 @@ use mongodb::{
use rocket::serde::json::Value; use rocket::serde::json::Value;
use serde::{Deserialize, Serialize}; 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)] #[derive(Serialize, Deserialize, Debug, Clone)]
#[serde(tag = "channel_type")] #[serde(tag = "channel_type")]
pub enum Channel { pub enum Channel {
@@ -36,7 +28,7 @@ pub enum Channel {
active: bool, active: bool,
recipients: Vec<String>, recipients: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
last_message: Option<LastMessage>, last_message_id: Option<String>,
}, },
Group { Group {
#[serde(rename = "_id")] #[serde(rename = "_id")]
@@ -53,7 +45,7 @@ pub enum Channel {
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
icon: Option<File>, icon: Option<File>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
last_message: Option<LastMessage>, last_message_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
permissions: Option<i32>, permissions: Option<i32>,
@@ -75,7 +67,7 @@ pub enum Channel {
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
icon: Option<File>, icon: Option<File>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
last_message: Option<String>, last_message_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")] #[serde(skip_serializing_if = "Option::is_none")]
default_permissions: Option<i32>, default_permissions: Option<i32>,

View File

@@ -8,7 +8,8 @@ use crate::{
use futures::StreamExt; use futures::StreamExt;
use mongodb::options::UpdateOptions; use mongodb::options::UpdateOptions;
use mongodb::{ use mongodb::{
bson::{doc, to_bson, DateTime}, bson::{doc, to_bson, DateTime, Document},
options::FindOptions,
}; };
use rauth::entities::{Model, Session}; use rauth::entities::{Model, Session};
use rocket::serde::json::Value; use rocket::serde::json::Value;
@@ -171,7 +172,6 @@ impl Message {
nonce: None, nonce: None,
channel, channel,
author, author,
content, content,
attachments: None, attachments: None,
edited: None, edited: None,
@@ -196,76 +196,19 @@ impl Message {
let ss = self.clone(); let ss = self.clone();
let c_clone = channel.clone(); let c_clone = channel.clone();
async_std::task::spawn(async move { 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::<String>()
}
}
} else {
doc! {}
};
// ! MARK AS ACTIVE let last_message_id = ss.id.clone();
// ! FIXME: temp code let mut set = doc! { "last_message_id": last_message_id };
let channels = get_collection("channels"); let channels = get_collection("channels");
match &c_clone { match &c_clone {
Channel::DirectMessage { id, .. } => { Channel::DirectMessage { id, .. } => {
// ! MARK AS ACTIVE
set.insert("active", true); set.insert("active", true);
channels update_channels_last_message(&channels, id, &set).await;
.update_one(
doc! { "_id": id },
doc! {
"$set": set
}, },
None, Channel::Group { id, .. } | Channel::TextChannel { id, .. } => {
) update_channels_last_message(&channels, id, &set).await;
.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();
}
} }
_ => {} _ => {}
} }
@@ -490,3 +433,15 @@ impl Message {
Ok(()) 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");
}

View File

@@ -78,7 +78,7 @@ pub async fn req(user: User, info: Json<Data>) -> Result<Value> {
owner: user.id, owner: user.id,
recipients: set.into_iter().collect::<Vec<String>>(), recipients: set.into_iter().collect::<Vec<String>>(),
icon: None, icon: None,
last_message: None, last_message_id: None,
permissions: None, permissions: None,
nsfw: info.nsfw.unwrap_or_default() nsfw: info.nsfw.unwrap_or_default()
}; };

View File

@@ -79,7 +79,7 @@ pub async fn req(user: User, target: Ref, info: Json<Data>) -> Result<Value> {
name: info.name, name: info.name,
description: info.description, description: info.description,
icon: None, icon: None,
last_message: None, last_message_id: None,
default_permissions: None, default_permissions: None,
role_permissions: HashMap::new(), role_permissions: HashMap::new(),

View File

@@ -88,7 +88,7 @@ pub async fn req(user: User, info: Json<Data>) -> Result<Value> {
description: None, description: None,
icon: None, icon: None,
last_message: None, last_message_id: None,
default_permissions: None, default_permissions: None,
role_permissions: HashMap::new(), role_permissions: HashMap::new(),

View File

@@ -40,7 +40,7 @@ pub async fn req(user: User, target: Ref) -> Result<Value> {
id, id,
active: false, active: false,
recipients: vec![user.id, target.id], recipients: vec![user.id, target.id],
last_message: None, last_message_id: None,
} }
}; };