feat: add admin channel wipe endpoint
This commit is contained in:
@@ -282,6 +282,16 @@ pub enum EventV1 {
|
||||
id: String,
|
||||
},
|
||||
|
||||
/// Channel wiped
|
||||
///
|
||||
/// Clients should remove all associated data:
|
||||
/// - Messages
|
||||
/// - Unreads
|
||||
/// - Voice States
|
||||
ChannelWipe {
|
||||
id: String,
|
||||
},
|
||||
|
||||
/// User joins a group
|
||||
ChannelGroupJoin {
|
||||
id: String,
|
||||
|
||||
@@ -762,6 +762,13 @@ impl Channel {
|
||||
// - channels list / categories list on server
|
||||
db.delete_channel(self).await
|
||||
}
|
||||
|
||||
/// Wipe a channel's messages
|
||||
pub async fn wipe(&self, db: &Database) -> Result<()> {
|
||||
let id = self.id().to_string();
|
||||
EventV1::ChannelWipe { id: id.clone() }.p(id).await;
|
||||
db.wipe_channel(self).await
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(feature = "mongodb")]
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use bson::{doc, Bson};
|
||||
use crate::{revolt_result::Result, Channel, FieldsChannel, PartialChannel};
|
||||
use revolt_permissions::OverrideField;
|
||||
|
||||
@@ -48,5 +49,6 @@ pub trait AbstractChannels: Sync + Send {
|
||||
async fn remove_user_from_group(&self, channel_id: &str, user_id: &str) -> Result<()>;
|
||||
|
||||
// Delete a channel
|
||||
async fn delete_channel(&self, channel_id: &Channel) -> Result<()>;
|
||||
async fn delete_channel(&self, channel_id: &Channel) -> Result<()>; // Wipe a channel's messages
|
||||
async fn wipe_channel(&self, channel: &Channel) -> Result<()>;
|
||||
}
|
||||
|
||||
@@ -261,6 +261,23 @@ impl AbstractChannels for MongoDb {
|
||||
// Delete the channel itself
|
||||
query!(self, delete_one_by_id, COL, channel.id()).map(|_| ())
|
||||
}
|
||||
|
||||
// Wipe a channel's messages
|
||||
async fn wipe_channel(&self, channel: &Channel) -> Result<()> {
|
||||
let id = channel.id().to_string();
|
||||
|
||||
// Delete invites and unreads.
|
||||
self.delete_associated_channel_objects(Bson::String(id.to_string()))
|
||||
.await?;
|
||||
|
||||
// Delete messages.
|
||||
self.delete_bulk_messages(doc! {
|
||||
"channel": &id
|
||||
})
|
||||
.await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl MongoDb {
|
||||
|
||||
@@ -151,4 +151,10 @@ impl AbstractChannels for ReferenceDb {
|
||||
Err(create_error!(NotFound))
|
||||
}
|
||||
}
|
||||
|
||||
async fn wipe_channel(&self, channel: &Channel) -> Result<()> {
|
||||
let mut messages = self.messages.lock().await;
|
||||
messages.retain(|_, message| message.channel != channel.id());
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user