From 179dcf0d4e69fe0761fb701dd098ffb1b12a5997 Mon Sep 17 00:00:00 2001 From: trivernis Date: Sun, 20 Feb 2022 14:31:36 +0100 Subject: [PATCH] Delete orphaned tags TG-109 #ready-for-test Signed-off-by: trivernis --- .../mediarepo-logic/src/dao/tag/mappings.rs | 40 ++++++++++++++++++- .../sidebar/tag-edit/tag-edit.component.html | 2 +- .../sidebar/tag-edit/tag-edit.component.ts | 15 ++++--- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/mediarepo-daemon/mediarepo-logic/src/dao/tag/mappings.rs b/mediarepo-daemon/mediarepo-logic/src/dao/tag/mappings.rs index ac9f26c..2289c1f 100644 --- a/mediarepo-daemon/mediarepo-logic/src/dao/tag/mappings.rs +++ b/mediarepo-daemon/mediarepo-logic/src/dao/tag/mappings.rs @@ -1,9 +1,10 @@ use sea_orm::prelude::*; +use sea_orm::sea_query::Query; use sea_orm::ActiveValue::Set; use sea_orm::{DatabaseTransaction, TransactionTrait}; use mediarepo_core::error::RepoResult; -use mediarepo_database::entities::content_descriptor_tag; +use mediarepo_database::entities::{content_descriptor_tag, namespace, tag}; use crate::dao::tag::TagDao; @@ -41,11 +42,15 @@ impl TagDao { #[tracing::instrument(level = "debug", skip(self))] pub async fn remove_mappings(&self, cd_ids: Vec, tag_ids: Vec) -> RepoResult<()> { + let trx = self.ctx.db.begin().await?; content_descriptor_tag::Entity::delete_many() .filter(content_descriptor_tag::Column::CdId.is_in(cd_ids)) .filter(content_descriptor_tag::Column::TagId.is_in(tag_ids)) - .exec(&self.ctx.db) + .exec(&trx) .await?; + delete_orphans(&trx).await?; + + trx.commit().await?; Ok(()) } @@ -66,3 +71,34 @@ async fn get_existing_mappings( .collect(); Ok(existing_mappings) } + +/// Deletes orphaned tag entries and namespaces from the database +async fn delete_orphans(trx: &DatabaseTransaction) -> RepoResult<()> { + tag::Entity::delete_many() + .filter( + tag::Column::Id.not_in_subquery( + Query::select() + .column(content_descriptor_tag::Column::TagId) + .from(content_descriptor_tag::Entity) + .group_by_col(content_descriptor_tag::Column::TagId) + .to_owned(), + ), + ) + .exec(trx) + .await?; + + namespace::Entity::delete_many() + .filter( + namespace::Column::Id.not_in_subquery( + Query::select() + .column(tag::Column::NamespaceId) + .from(tag::Entity) + .group_by_col(tag::Column::NamespaceId) + .to_owned(), + ), + ) + .exec(trx) + .await?; + + Ok(()) +} diff --git a/mediarepo-ui/src/app/components/shared/sidebar/tag-edit/tag-edit.component.html b/mediarepo-ui/src/app/components/shared/sidebar/tag-edit/tag-edit.component.html index b7f2b84..b7cb849 100644 --- a/mediarepo-ui/src/app/components/shared/sidebar/tag-edit/tag-edit.component.html +++ b/mediarepo-ui/src/app/components/shared/sidebar/tag-edit/tag-edit.component.html @@ -18,7 +18,7 @@
+ [availableTags]="(this.allTags | async) ?? []">