From c1d34e430cb0b7138742928cbfd5da05d22a0c59 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Thu, 8 Jul 2021 14:17:08 +0800 Subject: [PATCH] feat(api): add query parameter to filter on deleted series or books --- .../gotson/komga/domain/model/BookSearch.kt | 9 +++++++- .../gotson/komga/domain/model/SeriesSearch.kt | 4 +++- .../komga/infrastructure/jooq/BookDtoDao.kt | 5 ++++- .../komga/infrastructure/jooq/SeriesDtoDao.kt | 2 ++ .../interfaces/rest/ReadListController.kt | 9 ++++++++ .../rest/SeriesCollectionController.kt | 2 ++ .../komga/interfaces/rest/SeriesController.kt | 22 ++++++++++++++++--- .../rest/persistence/BookDtoRepository.kt | 3 ++- 8 files changed, 49 insertions(+), 7 deletions(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/BookSearch.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/BookSearch.kt index 38081e600..b8bd41db1 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/model/BookSearch.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/BookSearch.kt @@ -13,7 +13,14 @@ class BookSearchWithReadProgress( seriesIds: Collection? = null, searchTerm: String? = null, mediaStatus: Collection? = null, + deleted: Boolean? = null, val tags: Collection? = null, val readStatus: Collection? = null, val authors: Collection? = null, -) : BookSearch(libraryIds, seriesIds, searchTerm, mediaStatus) +) : BookSearch( + libraryIds = libraryIds, + seriesIds = seriesIds, + searchTerm = searchTerm, + mediaStatus = mediaStatus, + deleted = deleted +) diff --git a/komga/src/main/kotlin/org/gotson/komga/domain/model/SeriesSearch.kt b/komga/src/main/kotlin/org/gotson/komga/domain/model/SeriesSearch.kt index 8032a06e4..c36f85eb6 100644 --- a/komga/src/main/kotlin/org/gotson/komga/domain/model/SeriesSearch.kt +++ b/komga/src/main/kotlin/org/gotson/komga/domain/model/SeriesSearch.kt @@ -15,6 +15,7 @@ class SeriesSearchWithReadProgress( searchTerm: String? = null, metadataStatus: Collection? = null, publishers: Collection? = null, + deleted: Boolean? = null, val languages: Collection? = null, val genres: Collection? = null, val tags: Collection? = null, @@ -27,5 +28,6 @@ class SeriesSearchWithReadProgress( collectionIds = collectionIds, searchTerm = searchTerm, metadataStatus = metadataStatus, - publishers = publishers + publishers = publishers, + deleted = deleted, ) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/BookDtoDao.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/BookDtoDao.kt index 5809d3458..73d4ff082 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/BookDtoDao.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/BookDtoDao.kt @@ -71,9 +71,10 @@ class BookDtoDao( readListId: String, userId: String, filterOnLibraryIds: Collection?, + search: BookSearchWithReadProgress, pageable: Pageable ): Page { - val conditions = rlb.READLIST_ID.eq(readListId) + val conditions = rlb.READLIST_ID.eq(readListId).and(search.toCondition()) return findAll(conditions, userId, pageable, JoinConditions(selectReadListNumber = true), filterOnLibraryIds) } @@ -267,6 +268,8 @@ class BookDtoDao( if (!seriesIds.isNullOrEmpty()) c = c.and(b.SERIES_ID.`in`(seriesIds)) searchTerm?.let { c = c.and(d.TITLE.containsIgnoreCase(it)) } if (!mediaStatus.isNullOrEmpty()) c = c.and(m.STATUS.`in`(mediaStatus)) + if (deleted == true) c = c.and(b.DELETED_DATE.isNotNull) + if (deleted == false) c = c.and(b.DELETED_DATE.isNull) if (!tags.isNullOrEmpty()) c = c.and(lower(bt.TAG).`in`(tags.map { it.lowercase() })) if (readStatus != null) { diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesDtoDao.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesDtoDao.kt index a73d638a1..2d9549f1b 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesDtoDao.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/SeriesDtoDao.kt @@ -207,6 +207,8 @@ class SeriesDtoDao( searchTerm?.let { c = c.and(d.TITLE.containsIgnoreCase(it)) } if (!metadataStatus.isNullOrEmpty()) c = c.and(d.STATUS.`in`(metadataStatus)) if (!publishers.isNullOrEmpty()) c = c.and(lower(d.PUBLISHER).`in`(publishers.map { it.lowercase() })) + if (deleted == true) c = c.and(s.DELETED_DATE.isNotNull) + if (deleted == false) c = c.and(s.DELETED_DATE.isNull) if (!languages.isNullOrEmpty()) c = c.and(lower(d.LANGUAGE).`in`(languages.map { it.lowercase() })) if (!genres.isNullOrEmpty()) c = c.and(lower(g.GENRE).`in`(genres.map { it.lowercase() })) if (!tags.isNullOrEmpty()) c = c.and(lower(st.TAG).`in`(tags.map { it.lowercase() })) diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/ReadListController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/ReadListController.kt index d0bc296cd..7282ea77a 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/ReadListController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/ReadListController.kt @@ -5,7 +5,9 @@ import io.swagger.v3.oas.annotations.media.Content import io.swagger.v3.oas.annotations.media.Schema import io.swagger.v3.oas.annotations.responses.ApiResponse import mu.KotlinLogging +import org.gotson.komga.domain.model.BookSearchWithReadProgress import org.gotson.komga.domain.model.DuplicateNameException +import org.gotson.komga.domain.model.Media import org.gotson.komga.domain.model.ROLE_ADMIN import org.gotson.komga.domain.model.ReadList import org.gotson.komga.domain.persistence.ReadListRepository @@ -188,6 +190,8 @@ class ReadListController( fun getBooksForReadList( @PathVariable id: String, @AuthenticationPrincipal principal: KomgaPrincipal, + @RequestParam(name = "media_status", required = false) mediaStatus: List?, + @RequestParam(name = "deleted", required = false) deleted: Boolean?, @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @Parameter(hidden = true) page: Pageable ): Page = @@ -206,6 +210,10 @@ class ReadListController( readList.id, principal.user.id, principal.user.getAuthorizedLibraryIds(null), + BookSearchWithReadProgress( + mediaStatus = mediaStatus, + deleted = deleted, + ), pageRequest ) .map { it.restrictUrl(!principal.user.roleAdmin) } @@ -264,6 +272,7 @@ class ReadListController( readList.id, principal.user.id, principal.user.getAuthorizedLibraryIds(null), + BookSearchWithReadProgress(), UnpagedSorted(Sort.by(Sort.Order.asc("readList.number"))) ).filterIndexed { index, _ -> index < readProgress.lastBookRead } .forEach { book -> bookLifecycle.markReadProgressCompleted(book.id, principal.user) } diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesCollectionController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesCollectionController.kt index 9c689e0a6..7049731c9 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesCollectionController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesCollectionController.kt @@ -171,6 +171,7 @@ class SeriesCollectionController( @RequestParam(name = "tag", required = false) tags: List?, @RequestParam(name = "age_rating", required = false) ageRatings: List?, @RequestParam(name = "release_year", required = false) release_years: List?, + @RequestParam(name = "deleted", required = false) deleted: Boolean?, @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @Parameter(hidden = true) @Authors authors: List?, @Parameter(hidden = true) page: Pageable @@ -193,6 +194,7 @@ class SeriesCollectionController( metadataStatus = metadataStatus, readStatus = readStatus, publishers = publishers, + deleted = deleted, languages = languages, genres = genres, tags = tags, diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesController.kt index 7affb069e..ba221eeb3 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/SeriesController.kt @@ -107,6 +107,7 @@ class SeriesController( @RequestParam(name = "tag", required = false) tags: List?, @RequestParam(name = "age_rating", required = false) ageRatings: List?, @RequestParam(name = "release_year", required = false) release_years: List?, + @RequestParam(name = "deleted", required = false) deleted: Boolean?, @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @Parameter(hidden = true) @Authors authors: List?, @Parameter(hidden = true) page: Pageable @@ -130,6 +131,7 @@ class SeriesController( metadataStatus = metadataStatus, readStatus = readStatus, publishers = publishers, + deleted = deleted, languages = languages, genres = genres, tags = tags, @@ -148,6 +150,7 @@ class SeriesController( fun getLatestSeries( @AuthenticationPrincipal principal: KomgaPrincipal, @RequestParam(name = "library_id", required = false) libraryIds: List?, + @RequestParam(name = "deleted", required = false) deleted: Boolean?, @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @Parameter(hidden = true) page: Pageable ): Page { @@ -162,7 +165,10 @@ class SeriesController( ) return seriesDtoRepository.findAll( - SeriesSearchWithReadProgress(principal.user.getAuthorizedLibraryIds(libraryIds)), + SeriesSearchWithReadProgress( + libraryIds = principal.user.getAuthorizedLibraryIds(libraryIds), + deleted = deleted, + ), principal.user.id, pageRequest ).map { it.restrictUrl(!principal.user.roleAdmin) } @@ -174,6 +180,7 @@ class SeriesController( fun getNewSeries( @AuthenticationPrincipal principal: KomgaPrincipal, @RequestParam(name = "library_id", required = false) libraryIds: List?, + @RequestParam(name = "deleted", required = false) deleted: Boolean?, @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @Parameter(hidden = true) page: Pageable ): Page { @@ -188,7 +195,10 @@ class SeriesController( ) return seriesDtoRepository.findAll( - SeriesSearchWithReadProgress(principal.user.getAuthorizedLibraryIds(libraryIds)), + SeriesSearchWithReadProgress( + libraryIds = principal.user.getAuthorizedLibraryIds(libraryIds), + deleted = deleted, + ), principal.user.id, pageRequest ).map { it.restrictUrl(!principal.user.roleAdmin) } @@ -200,6 +210,7 @@ class SeriesController( fun getUpdatedSeries( @AuthenticationPrincipal principal: KomgaPrincipal, @RequestParam(name = "library_id", required = false) libraryIds: List?, + @RequestParam(name = "deleted", required = false) deleted: Boolean?, @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @Parameter(hidden = true) page: Pageable ): Page { @@ -214,7 +225,10 @@ class SeriesController( ) return seriesDtoRepository.findAllRecentlyUpdated( - SeriesSearchWithReadProgress(principal.user.getAuthorizedLibraryIds(libraryIds)), + SeriesSearchWithReadProgress( + libraryIds = principal.user.getAuthorizedLibraryIds(libraryIds), + deleted = deleted, + ), principal.user.id, pageRequest ).map { it.restrictUrl(!principal.user.roleAdmin) } @@ -252,6 +266,7 @@ class SeriesController( @RequestParam(name = "media_status", required = false) mediaStatus: List?, @RequestParam(name = "read_status", required = false) readStatus: List?, @RequestParam(name = "tag", required = false) tags: List?, + @RequestParam(name = "deleted", required = false) deleted: Boolean?, @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @Parameter(hidden = true) @Authors authors: List?, @Parameter(hidden = true) page: Pageable @@ -275,6 +290,7 @@ class SeriesController( BookSearchWithReadProgress( seriesIds = listOf(seriesId), mediaStatus = mediaStatus, + deleted = deleted, readStatus = readStatus, tags = tags, authors = authors, diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/persistence/BookDtoRepository.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/persistence/BookDtoRepository.kt index 0a51dc056..90a1d4d8c 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/persistence/BookDtoRepository.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/persistence/BookDtoRepository.kt @@ -15,7 +15,8 @@ interface BookDtoRepository { readListId: String, userId: String, filterOnLibraryIds: Collection?, - pageable: Pageable + search: BookSearchWithReadProgress, + pageable: Pageable, ): Page fun findByIdOrNull(bookId: String, userId: String): BookDto?