From 37ab3dc456c8b85dc3d1551cdc634ed383f59afb Mon Sep 17 00:00:00 2001 From: silverpill Date: Sat, 25 Mar 2023 00:12:20 +0000 Subject: [PATCH] Add prune-remote-emojis command --- CHANGELOG.md | 4 ++++ docs/mitractl.md | 6 ++++++ mitra-cli/src/cli.rs | 22 ++++++++++++++++++++++ mitra-cli/src/main.rs | 1 + src/models/emojis/queries.rs | 28 ++++++++++++++++++++++++++++ 5 files changed, 61 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3275f7a..e196afe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +### Added + +- Added `prune-remote-emojis` command. + ### Fixed - Fixed error in emoji update SQL query. diff --git a/docs/mitractl.md b/docs/mitractl.md index a58a80b..94fb116 100644 --- a/docs/mitractl.md +++ b/docs/mitractl.md @@ -80,6 +80,12 @@ Delete empty remote profiles: mitractl delete-empty-profiles 100 ``` +Delete unused remote emojis: + +```shell +mitractl prune-remote-emojis +``` + Import custom emoji from another instance: ```shell diff --git a/mitra-cli/src/cli.rs b/mitra-cli/src/cli.rs index 46ff564..e14cd61 100644 --- a/mitra-cli/src/cli.rs +++ b/mitra-cli/src/cli.rs @@ -22,6 +22,7 @@ use mitra::models::{ emojis::queries::{ create_emoji, delete_emoji, + find_unused_remote_emojis, get_emoji_by_name_and_hostname, }, emojis::validators::EMOJI_LOCAL_MAX_SIZE, @@ -82,6 +83,7 @@ pub enum SubCommand { DeleteUnusedAttachments(DeleteUnusedAttachments), DeleteOrphanedFiles(DeleteOrphanedFiles), DeleteEmptyProfiles(DeleteEmptyProfiles), + PruneRemoteEmojis(PruneRemoteEmojis), ListUnreachableActors(ListUnreachableActors), ImportEmoji(ImportEmoji), UpdateCurrentBlock(UpdateCurrentBlock), @@ -425,6 +427,26 @@ impl DeleteEmptyProfiles { } } +/// Delete unused remote emojis +#[derive(Parser)] +pub struct PruneRemoteEmojis; + +impl PruneRemoteEmojis { + pub async fn execute( + &self, + config: &Config, + db_client: &mut impl DatabaseClient, + ) -> Result<(), Error> { + let emojis = find_unused_remote_emojis(db_client).await?; + for emoji_id in emojis { + let deletion_queue = delete_emoji(db_client, &emoji_id).await?; + remove_media(config, deletion_queue).await; + println!("emoji {} deleted", emoji_id); + }; + Ok(()) + } +} + /// List unreachable actors #[derive(Parser)] pub struct ListUnreachableActors { diff --git a/mitra-cli/src/main.rs b/mitra-cli/src/main.rs index eae1617..df48ab9 100644 --- a/mitra-cli/src/main.rs +++ b/mitra-cli/src/main.rs @@ -41,6 +41,7 @@ async fn main() { SubCommand::DeleteUnusedAttachments(cmd) => cmd.execute(&config, db_client).await.unwrap(), SubCommand::DeleteOrphanedFiles(cmd) => cmd.execute(&config, db_client).await.unwrap(), SubCommand::DeleteEmptyProfiles(cmd) => cmd.execute(&config, db_client).await.unwrap(), + SubCommand::PruneRemoteEmojis(cmd) => cmd.execute(&config, db_client).await.unwrap(), SubCommand::ListUnreachableActors(cmd) => cmd.execute(&config, db_client).await.unwrap(), SubCommand::ImportEmoji(cmd) => cmd.execute(&config, db_client).await.unwrap(), SubCommand::UpdateCurrentBlock(cmd) => cmd.execute(&config, db_client).await.unwrap(), diff --git a/src/models/emojis/queries.rs b/src/models/emojis/queries.rs index 3492fe0..b2330eb 100644 --- a/src/models/emojis/queries.rs +++ b/src/models/emojis/queries.rs @@ -188,6 +188,34 @@ pub async fn delete_emoji( }) } +pub async fn find_unused_remote_emojis( + db_client: &impl DatabaseClient, +) -> Result, DatabaseError> { + let rows = db_client.query( + " + SELECT emoji.id + FROM emoji + WHERE + emoji.object_id IS NOT NULL + AND NOT EXISTS ( + SELECT 1 + FROM post_emoji + WHERE post_emoji.emoji_id = emoji.id + ) + AND NOT EXISTS ( + SELECT 1 + FROM profile_emoji + WHERE profile_emoji.emoji_id = emoji.id + ) + ", + &[], + ).await?; + let ids: Vec = rows.iter() + .map(|row| row.try_get("id")) + .collect::>()?; + Ok(ids) +} + #[cfg(test)] mod tests { use serial_test::serial;