Add delete-emoji command
This commit is contained in:
parent
578629f8bd
commit
6ba8434f40
5 changed files with 74 additions and 0 deletions
|
@ -50,6 +50,12 @@ Delete post:
|
||||||
mitractl delete-post 55a3005f-f293-4168-ab70-6ab09a879679
|
mitractl delete-post 55a3005f-f293-4168-ab70-6ab09a879679
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Delete custom emoji:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
mitractl delete-emoji 55a3005f-f293-4168-ab70-6ab09a879679
|
||||||
|
```
|
||||||
|
|
||||||
Remove remote posts and media older than 30 days:
|
Remove remote posts and media older than 30 days:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
|
|
|
@ -29,6 +29,7 @@ async fn main() {
|
||||||
SubCommand::RefetchActor(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::RefetchActor(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
SubCommand::DeleteProfile(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::DeleteProfile(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
SubCommand::DeletePost(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::DeletePost(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
|
SubCommand::DeleteEmoji(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
SubCommand::DeleteExtraneousPosts(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::DeleteExtraneousPosts(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
SubCommand::DeleteUnusedAttachments(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::DeleteUnusedAttachments(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
SubCommand::DeleteOrphanedFiles(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
SubCommand::DeleteOrphanedFiles(cmd) => cmd.execute(&config, db_client).await.unwrap(),
|
||||||
|
|
21
src/cli.rs
21
src/cli.rs
|
@ -16,6 +16,7 @@ use crate::ethereum::sync::save_current_block_number;
|
||||||
use crate::ethereum::utils::key_to_ethereum_address;
|
use crate::ethereum::utils::key_to_ethereum_address;
|
||||||
use crate::models::attachments::queries::delete_unused_attachments;
|
use crate::models::attachments::queries::delete_unused_attachments;
|
||||||
use crate::models::cleanup::find_orphaned_files;
|
use crate::models::cleanup::find_orphaned_files;
|
||||||
|
use crate::models::emojis::queries::delete_emoji;
|
||||||
use crate::models::posts::queries::{delete_post, find_extraneous_posts, get_post_by_id};
|
use crate::models::posts::queries::{delete_post, find_extraneous_posts, get_post_by_id};
|
||||||
use crate::models::profiles::queries::{
|
use crate::models::profiles::queries::{
|
||||||
delete_profile,
|
delete_profile,
|
||||||
|
@ -62,6 +63,7 @@ pub enum SubCommand {
|
||||||
RefetchActor(RefetchActor),
|
RefetchActor(RefetchActor),
|
||||||
DeleteProfile(DeleteProfile),
|
DeleteProfile(DeleteProfile),
|
||||||
DeletePost(DeletePost),
|
DeletePost(DeletePost),
|
||||||
|
DeleteEmoji(DeleteEmoji),
|
||||||
DeleteExtraneousPosts(DeleteExtraneousPosts),
|
DeleteExtraneousPosts(DeleteExtraneousPosts),
|
||||||
DeleteUnusedAttachments(DeleteUnusedAttachments),
|
DeleteUnusedAttachments(DeleteUnusedAttachments),
|
||||||
DeleteOrphanedFiles(DeleteOrphanedFiles),
|
DeleteOrphanedFiles(DeleteOrphanedFiles),
|
||||||
|
@ -251,6 +253,25 @@ impl DeletePost {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Delete custom emoji
|
||||||
|
#[derive(Parser)]
|
||||||
|
pub struct DeleteEmoji {
|
||||||
|
id: Uuid,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DeleteEmoji {
|
||||||
|
pub async fn execute(
|
||||||
|
&self,
|
||||||
|
config: &Config,
|
||||||
|
db_client: &impl GenericClient,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
let deletion_queue = delete_emoji(db_client, &self.id).await?;
|
||||||
|
deletion_queue.process(config).await;
|
||||||
|
println!("emoji deleted");
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Delete old remote posts
|
/// Delete old remote posts
|
||||||
#[derive(Parser)]
|
#[derive(Parser)]
|
||||||
pub struct DeleteExtraneousPosts {
|
pub struct DeleteExtraneousPosts {
|
||||||
|
|
|
@ -47,6 +47,10 @@ pub async fn find_orphaned_files(
|
||||||
WHERE avatar ->> 'file_name' = fname
|
WHERE avatar ->> 'file_name' = fname
|
||||||
OR banner ->> 'file_name' = fname
|
OR banner ->> 'file_name' = fname
|
||||||
)
|
)
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1 FROM emoji
|
||||||
|
WHERE image ->> 'file_name' = fname
|
||||||
|
)
|
||||||
",
|
",
|
||||||
&[&files],
|
&[&files],
|
||||||
).await?;
|
).await?;
|
||||||
|
|
|
@ -4,6 +4,7 @@ use uuid::Uuid;
|
||||||
|
|
||||||
use crate::database::{catch_unique_violation, DatabaseError};
|
use crate::database::{catch_unique_violation, DatabaseError};
|
||||||
use crate::models::{
|
use crate::models::{
|
||||||
|
cleanup::{find_orphaned_files, DeletionQueue},
|
||||||
instances::queries::create_instance,
|
instances::queries::create_instance,
|
||||||
profiles::types::ProfileImage,
|
profiles::types::ProfileImage,
|
||||||
};
|
};
|
||||||
|
@ -99,6 +100,29 @@ pub async fn get_emoji_by_remote_object_id(
|
||||||
Ok(emoji)
|
Ok(emoji)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn delete_emoji(
|
||||||
|
db_client: &impl GenericClient,
|
||||||
|
emoji_id: &Uuid,
|
||||||
|
) -> Result<DeletionQueue, DatabaseError> {
|
||||||
|
let maybe_row = db_client.query_opt(
|
||||||
|
"
|
||||||
|
DELETE FROM emoji WHERE id = $1
|
||||||
|
RETURNING emoji
|
||||||
|
",
|
||||||
|
&[&emoji_id],
|
||||||
|
).await?;
|
||||||
|
let row = maybe_row.ok_or(DatabaseError::NotFound("emoji"))?;
|
||||||
|
let emoji: DbEmoji = row.try_get("emoji")?;
|
||||||
|
let orphaned_files = find_orphaned_files(
|
||||||
|
db_client,
|
||||||
|
vec![emoji.image.file_name],
|
||||||
|
).await?;
|
||||||
|
Ok(DeletionQueue {
|
||||||
|
files: orphaned_files,
|
||||||
|
ipfs_objects: vec![],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use serial_test::serial;
|
use serial_test::serial;
|
||||||
|
@ -132,4 +156,22 @@ mod tests {
|
||||||
assert_eq!(emoji.emoji_name, emoji_name);
|
assert_eq!(emoji.emoji_name, emoji_name);
|
||||||
assert_eq!(emoji.hostname, Some(hostname.to_string()));
|
assert_eq!(emoji.hostname, Some(hostname.to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[tokio::test]
|
||||||
|
#[serial]
|
||||||
|
async fn test_delete_emoji() {
|
||||||
|
let db_client = &create_test_database().await;
|
||||||
|
let emoji = create_emoji(
|
||||||
|
db_client,
|
||||||
|
"test",
|
||||||
|
None,
|
||||||
|
"test.png",
|
||||||
|
"image/png",
|
||||||
|
None,
|
||||||
|
&Utc::now(),
|
||||||
|
).await.unwrap();
|
||||||
|
let deletion_queue = delete_emoji(db_client, &emoji.id).await.unwrap();
|
||||||
|
assert_eq!(deletion_queue.files.len(), 1);
|
||||||
|
assert_eq!(deletion_queue.ipfs_objects.len(), 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue