diff --git a/crates/delta/src/routes/customisation/emoji_delete.rs b/crates/delta/src/routes/customisation/emoji_delete.rs index 24def4cc..24f590f3 100644 --- a/crates/delta/src/routes/customisation/emoji_delete.rs +++ b/crates/delta/src/routes/customisation/emoji_delete.rs @@ -28,6 +28,7 @@ pub async fn delete_emoji(db: &Db, user: User, id: Ref) -> Result .throw_permission(db, Permission::ManageCustomisation) .await?; } + EmojiParent::Detached => return Ok(EmptyResponse), }; } diff --git a/crates/quark/src/impl/dummy/media/emoji.rs b/crates/quark/src/impl/dummy/media/emoji.rs index 82847fc9..bd2ff700 100644 --- a/crates/quark/src/impl/dummy/media/emoji.rs +++ b/crates/quark/src/impl/dummy/media/emoji.rs @@ -33,9 +33,9 @@ impl AbstractEmoji for DummyDb { Ok(()) } - /// Delete an emoji by its id - async fn delete_emoji(&self, emoji: &Emoji) -> Result<()> { - info!("Delete {emoji:?}"); + /// Detach an emoji by its id + async fn detach_emoji(&self, emoji: &Emoji) -> Result<()> { + info!("Detach {emoji:?}"); Ok(()) } } diff --git a/crates/quark/src/impl/generic/media/emoji.rs b/crates/quark/src/impl/generic/media/emoji.rs index dade6736..145b7047 100644 --- a/crates/quark/src/impl/generic/media/emoji.rs +++ b/crates/quark/src/impl/generic/media/emoji.rs @@ -9,6 +9,7 @@ impl Emoji { fn parent(&self) -> &str { match &self.parent { EmojiParent::Server { id } => id, + EmojiParent::Detached => "", } } @@ -30,7 +31,6 @@ impl Emoji { .p(self.parent().to_string()) .await; - db.mark_attachment_as_deleted(&self.id).await?; - db.delete_emoji(&self).await + db.detach_emoji(&self).await } } diff --git a/crates/quark/src/impl/mongo/media/emoji.rs b/crates/quark/src/impl/mongo/media/emoji.rs index 596bef0e..848c006c 100644 --- a/crates/quark/src/impl/mongo/media/emoji.rs +++ b/crates/quark/src/impl/mongo/media/emoji.rs @@ -1,5 +1,7 @@ +use bson::Document; + use crate::models::Emoji; -use crate::{AbstractEmoji, Result}; +use crate::{AbstractEmoji, Error, Result}; use super::super::MongoDb; @@ -42,7 +44,26 @@ impl AbstractEmoji for MongoDb { } /// Delete an emoji by its id - async fn delete_emoji(&self, emoji: &Emoji) -> Result<()> { - self.delete_one_by_id(COL, &emoji.id).await.map(|_| ()) + async fn detach_emoji(&self, emoji: &Emoji) -> Result<()> { + self.col::(COL) + .update_one( + doc! { + "_id": &emoji.id + }, + doc! { + "$set": { + "parent": { + "type": "Detached" + } + } + }, + None, + ) + .await + .map(|_| ()) + .map_err(|_| Error::DatabaseError { + operation: "update_one", + with: "emojis", + }) } } diff --git a/crates/quark/src/models/media/emoji.rs b/crates/quark/src/models/media/emoji.rs index b1c35d37..44df4746 100644 --- a/crates/quark/src/models/media/emoji.rs +++ b/crates/quark/src/models/media/emoji.rs @@ -5,6 +5,7 @@ use serde::{Deserialize, Serialize}; #[serde(tag = "type")] pub enum EmojiParent { Server { id: String }, + Detached, } /// Representation of an Emoji on Revolt diff --git a/crates/quark/src/traits/media/emoji.rs b/crates/quark/src/traits/media/emoji.rs index b8ed849e..fc873e34 100644 --- a/crates/quark/src/traits/media/emoji.rs +++ b/crates/quark/src/traits/media/emoji.rs @@ -15,6 +15,6 @@ pub trait AbstractEmoji: Sync + Send { /// Insert emoji into database. async fn insert_emoji(&self, emoji: &Emoji) -> Result<()>; - /// Delete an emoji by its id - async fn delete_emoji(&self, emoji: &Emoji) -> Result<()>; + /// Detach an emoji by its id + async fn detach_emoji(&self, emoji: &Emoji) -> Result<()>; }