Skip to content

Commit

Permalink
fix: Switch to remove for unpinning
Browse files Browse the repository at this point in the history
  • Loading branch information
Zomatree committed Jul 21, 2024
1 parent d2f4823 commit c50435d
Show file tree
Hide file tree
Showing 11 changed files with 69 additions and 18 deletions.
6 changes: 2 additions & 4 deletions crates/core/database/src/events/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@ use authifier::AuthifierEvent;
use serde::{Deserialize, Serialize};

use revolt_models::v0::{
AppendMessage, Channel, ChannelUnread, Emoji, FieldsChannel, FieldsMember, FieldsRole,
FieldsServer, FieldsUser, FieldsWebhook, Member, MemberCompositeKey, Message, PartialChannel,
PartialMember, PartialMessage, PartialRole, PartialServer, PartialUser, PartialWebhook,
RemovalIntention, Report, Server, User, UserSettings, Webhook,
AppendMessage, Channel, ChannelUnread, Emoji, FieldsChannel, FieldsMember, FieldsMessage, FieldsRole, FieldsServer, FieldsUser, FieldsWebhook, Member, MemberCompositeKey, Message, PartialChannel, PartialMember, PartialMessage, PartialRole, PartialServer, PartialUser, PartialWebhook, RemovalIntention, Report, Server, User, UserSettings, Webhook
};
use revolt_result::Error;

Expand Down Expand Up @@ -92,6 +89,7 @@ pub enum EventV1 {
id: String,
channel: String,
data: PartialMessage,
clear: Vec<FieldsMessage>,
},

/// Append information to existing message
Expand Down
19 changes: 15 additions & 4 deletions crates/core/database/src/models/messages/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ use indexmap::{IndexMap, IndexSet};
use iso8601_timestamp::Timestamp;
use revolt_config::{config, FeaturesLimits};
use revolt_models::v0::{
self, BulkMessageResponse, DataMessageSend, Embed, MessageAuthor, MessageFlags, MessageSort,
MessageWebhook, PushNotification, ReplyIntent, SendableEmbed, Text, RE_MENTION,
self, BulkMessageResponse, DataMessageSend, Embed, MessageAuthor, MessageFlags, MessageSort, MessageWebhook, PushNotification, ReplyIntent, SendableEmbed, Text, RE_MENTION
};
use revolt_permissions::{ChannelPermission, PermissionValue};
use revolt_result::Result;
Expand Down Expand Up @@ -188,6 +187,11 @@ auto_derived!(
#[serde(flatten)]
pub time_period: MessageTimePeriod,
}

/// Optional fields on message
pub enum FieldsMessage {
Pinned
}
);

#[allow(clippy::derivable_impls)]
Expand Down Expand Up @@ -519,14 +523,15 @@ impl Message {
}

/// Update message data
pub async fn update(&mut self, db: &Database, partial: PartialMessage) -> Result<()> {
pub async fn update(&mut self, db: &Database, partial: PartialMessage, remove: Vec<FieldsMessage>) -> Result<()> {
self.apply_options(partial.clone());
db.update_message(&self.id, &partial).await?;
db.update_message(&self.id, &partial, remove.clone()).await?;

EventV1::MessageUpdate {
id: self.id.clone(),
channel: self.channel.clone(),
data: partial.into(),
clear: remove.into_iter().map(|field| field.into()).collect()
}
.p(self.channel.clone())
.await;
Expand Down Expand Up @@ -808,6 +813,12 @@ impl Message {
// Write to database
db.clear_reaction(&self.id, emoji).await
}

pub fn remove_field(&mut self, field: &FieldsMessage) {
match field {
FieldsMessage::Pinned => self.pinned = None
}
}
}

impl SystemMessage {
Expand Down
4 changes: 2 additions & 2 deletions crates/core/database/src/models/messages/ops.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use revolt_result::Result;

use crate::{AppendMessage, Message, MessageQuery, PartialMessage};
use crate::{AppendMessage, FieldsMessage, Message, MessageQuery, PartialMessage};

mod mongodb;
mod reference;
Expand All @@ -20,7 +20,7 @@ pub trait AbstractMessages: Sync + Send {
async fn fetch_messages_by_id(&self, ids: &[String]) -> Result<Vec<Message>>;

/// Update a given message with new information
async fn update_message(&self, id: &str, message: &PartialMessage) -> Result<()>;
async fn update_message(&self, id: &str, message: &PartialMessage, remove: Vec<FieldsMessage>) -> Result<()>;

/// Append information to a given message
async fn append_message(&self, id: &str, append: &AppendMessage) -> Result<()>;
Expand Down
22 changes: 19 additions & 3 deletions crates/core/database/src/models/messages/ops/mongodb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ use revolt_models::v0::MessageSort;
use revolt_result::Result;

use crate::{
AppendMessage, DocumentId, Message, MessageQuery, MessageTimePeriod, MongoDb, PartialMessage,
AppendMessage, DocumentId, FieldsMessage, IntoDocumentPath, Message, MessageQuery, MessageTimePeriod, MongoDb, PartialMessage
};

use super::AbstractMessages;
Expand Down Expand Up @@ -182,8 +182,16 @@ impl AbstractMessages for MongoDb {
}

/// Update a given message with new information
async fn update_message(&self, id: &str, message: &PartialMessage) -> Result<()> {
query!(self, update_one_by_id, COL, id, message, vec![], None).map(|_| ())
async fn update_message(&self, id: &str, message: &PartialMessage, remove: Vec<FieldsMessage>) -> Result<()> {
query!(
self,
update_one_by_id,
COL,
id,
message,
remove.iter().map(|x| x as &dyn IntoDocumentPath).collect(),
None
).map(|_| ())
}

/// Append information to a given message
Expand Down Expand Up @@ -301,6 +309,14 @@ impl AbstractMessages for MongoDb {
}
}

impl IntoDocumentPath for FieldsMessage {
fn as_path(&self) -> Option<&'static str> {
Some(match self {
FieldsMessage::Pinned => "pinned"
})
}
}

impl MongoDb {
pub async fn delete_bulk_messages(&self, projection: Document) -> Result<()> {
let mut for_attachments = projection.clone();
Expand Down
9 changes: 7 additions & 2 deletions crates/core/database/src/models/messages/ops/reference.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use futures::future::try_join_all;
use indexmap::IndexSet;
use revolt_result::Result;

use crate::{AppendMessage, Message, MessageQuery, PartialMessage, ReferenceDb};
use crate::{AppendMessage, FieldsMessage, Message, MessageQuery, PartialMessage, ReferenceDb};

use super::AbstractMessages;

Expand Down Expand Up @@ -189,10 +189,15 @@ impl AbstractMessages for ReferenceDb {
}

/// Update a given message with new information
async fn update_message(&self, id: &str, message: &PartialMessage) -> Result<()> {
async fn update_message(&self, id: &str, message: &PartialMessage, remove: Vec<FieldsMessage>) -> Result<()> {
let mut messages = self.messages.lock().await;
if let Some(message_data) = messages.get_mut(id) {
message_data.apply_options(message.to_owned());

for field in remove {
#[allow(clippy::disallowed_methods)]
message_data.remove_field(&field);
}
Ok(())
} else {
Err(create_error!(NotFound))
Expand Down
15 changes: 15 additions & 0 deletions crates/core/database/src/util/bridge/v0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1322,3 +1322,18 @@ impl From<BotInformation> for crate::BotInformation {
}
}
}

impl From<crate::FieldsMessage> for FieldsMessage {
fn from(value: crate::FieldsMessage) -> Self {
match value {
crate::FieldsMessage::Pinned => FieldsMessage::Pinned,
}
}
}
impl From<FieldsMessage> for crate::FieldsMessage {
fn from(value: FieldsMessage) -> Self {
match value {
FieldsMessage::Pinned => crate::FieldsMessage::Pinned,
}
}
}
5 changes: 5 additions & 0 deletions crates/core/models/src/v0/messages.rs
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,11 @@ auto_derived!(
/// Message will not send push / desktop notifications
SuppressNotifications = 1,
}

/// Optional fields on message
pub enum FieldsMessage {
Pinned
}
);

/// Message Author Abstraction
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ pub async fn clear_reactions(
reactions: Some(Default::default()),
..Default::default()
},
vec![]
)
.await
.map(|_| EmptyResponse)
Expand Down
2 changes: 1 addition & 1 deletion crates/delta/src/routes/channels/message_edit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ pub async fn edit(

partial.embeds = Some(new_embeds);

message.update(db, partial).await?;
message.update(db, partial, vec![]).await?;

// Queue up a task for processing embeds if the we have sufficient permissions
if permissions.has_channel_permission(ChannelPermission::SendEmbeds) {
Expand Down
2 changes: 1 addition & 1 deletion crates/delta/src/routes/channels/message_pin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ pub async fn message_pin(
message.update(db, PartialMessage {
pinned: Some(true),
..Default::default()
}).await?;
}, vec![]).await?;

Ok(EmptyResponse)
}
2 changes: 1 addition & 1 deletion crates/delta/src/routes/channels/message_unpin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ pub async fn message_unpin(
message.update(db, PartialMessage {
pinned: Some(false),
..Default::default()
}).await?;
}, vec![FieldsMessage::Pinned]).await?;

Ok(EmptyResponse)
}

0 comments on commit c50435d

Please sign in to comment.