diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/ReadListRepository.kt b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/ReadListRepository.kt index 13be3026d..551ab5f47 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/ReadListRepository.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/ReadListRepository.kt @@ -37,5 +37,6 @@ interface ReadListRepository { fun delete(readListId: String) fun deleteAll() + fun deleteEmpty() fun existsByName(name: String): Boolean } diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/SeriesCollectionRepository.kt b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/SeriesCollectionRepository.kt index 2d4da958f..9fe4edb06 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/persistence/SeriesCollectionRepository.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/persistence/SeriesCollectionRepository.kt @@ -37,5 +37,6 @@ interface SeriesCollectionRepository { fun delete(collectionId: String) fun deleteAll() + fun deleteEmpty() fun existsByName(name: String): Boolean } diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/service/LibraryContentLifecycle.kt b/komga/src/main/kotlin/org/gotson/komga/domain/service/LibraryContentLifecycle.kt index 1dc69ba0d..58c2cf8bd 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/service/LibraryContentLifecycle.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/service/LibraryContentLifecycle.kt @@ -6,7 +6,10 @@ import org.gotson.komga.domain.model.Library import org.gotson.komga.domain.model.Media import org.gotson.komga.domain.persistence.BookRepository import org.gotson.komga.domain.persistence.MediaRepository +import org.gotson.komga.domain.persistence.ReadListRepository +import org.gotson.komga.domain.persistence.SeriesCollectionRepository import org.gotson.komga.domain.persistence.SeriesRepository +import org.gotson.komga.infrastructure.configuration.KomgaProperties import org.springframework.stereotype.Service import java.nio.file.Paths import java.time.temporal.ChronoUnit @@ -22,6 +25,9 @@ class LibraryContentLifecycle( private val bookLifecycle: BookLifecycle, private val mediaRepository: MediaRepository, private val seriesLifecycle: SeriesLifecycle, + private val collectionRepository: SeriesCollectionRepository, + private val readListRepository: ReadListRepository, + private val komgaProperties: KomgaProperties, private val taskReceiver: TaskReceiver, ) { @@ -116,6 +122,16 @@ class LibraryContentLifecycle( } } } + + if (komgaProperties.deleteEmptyCollections) { + logger.info { "Deleting empty collections" } + collectionRepository.deleteEmpty() + } + + if (komgaProperties.deleteEmptyReadLists) { + logger.info { "Deleting empty read lists" } + readListRepository.deleteEmpty() + } }.also { logger.info { "Library updated in $it" } } } } diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/configuration/KomgaProperties.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/configuration/KomgaProperties.kt index f80a92019..9ee6b21e6 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/configuration/KomgaProperties.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/configuration/KomgaProperties.kt @@ -16,6 +16,10 @@ class KomgaProperties { var librariesScanDirectoryExclusions: List = emptyList() + var deleteEmptyReadLists: Boolean = true + + var deleteEmptyCollections: Boolean = true + var rememberMe = RememberMe() var nativeWebp: Boolean = true diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/ReadListDao.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/ReadListDao.kt index 81f79a081..73fe9a9a5 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/ReadListDao.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/ReadListDao.kt @@ -209,6 +209,18 @@ class ReadListDao( } } + override fun deleteEmpty() { + dsl.deleteFrom(rl) + .where( + rl.ID.`in`( + dsl.select(rl.ID) + .from(rl) + .leftJoin(rlb).on(rl.ID.eq(rlb.READLIST_ID)) + .where(rlb.READLIST_ID.isNull) + ) + ).execute() + } + override fun existsByName(name: String): Boolean = dsl.fetchExists( dsl.selectFrom(rl) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesCollectionDao.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesCollectionDao.kt index 7c34cf909..bd361d9a1 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesCollectionDao.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesCollectionDao.kt @@ -209,6 +209,18 @@ class SeriesCollectionDao( } } + override fun deleteEmpty() { + dsl.deleteFrom(c) + .where( + c.ID.`in`( + dsl.select(c.ID) + .from(c) + .leftJoin(cs).on(c.ID.eq(cs.COLLECTION_ID)) + .where(cs.COLLECTION_ID.isNull) + ) + ).execute() + } + override fun existsByName(name: String): Boolean = dsl.fetchExists( dsl.selectFrom(c) diff --git a/komga/src/main/resources/application-dev.yml b/komga/src/main/resources/application-dev.yml index 315b0b9a0..bd631c2c2 100644 --- a/komga/src/main/resources/application-dev.yml +++ b/komga/src/main/resources/application-dev.yml @@ -9,6 +9,8 @@ komga: file: ":memory:" cors.allowed-origins: - http://localhost:8081 +# delete-empty-collections: true +# delete-empty-read-lists: true spring: artemis: embedded: