feat(api): add query parameter to filter on deleted series or books

This commit is contained in:
Gauthier Roebroeck 2021-07-08 14:17:08 +08:00
parent 5b6b817085
commit c1d34e430c
8 changed files with 49 additions and 7 deletions

View file

@ -13,7 +13,14 @@ class BookSearchWithReadProgress(
seriesIds: Collection<String>? = null,
searchTerm: String? = null,
mediaStatus: Collection<Media.Status>? = null,
deleted: Boolean? = null,
val tags: Collection<String>? = null,
val readStatus: Collection<ReadStatus>? = null,
val authors: Collection<Author>? = null,
) : BookSearch(libraryIds, seriesIds, searchTerm, mediaStatus)
) : BookSearch(
libraryIds = libraryIds,
seriesIds = seriesIds,
searchTerm = searchTerm,
mediaStatus = mediaStatus,
deleted = deleted
)

View file

@ -15,6 +15,7 @@ class SeriesSearchWithReadProgress(
searchTerm: String? = null,
metadataStatus: Collection<SeriesMetadata.Status>? = null,
publishers: Collection<String>? = null,
deleted: Boolean? = null,
val languages: Collection<String>? = null,
val genres: Collection<String>? = null,
val tags: Collection<String>? = null,
@ -27,5 +28,6 @@ class SeriesSearchWithReadProgress(
collectionIds = collectionIds,
searchTerm = searchTerm,
metadataStatus = metadataStatus,
publishers = publishers
publishers = publishers,
deleted = deleted,
)

View file

@ -71,9 +71,10 @@ class BookDtoDao(
readListId: String,
userId: String,
filterOnLibraryIds: Collection<String>?,
search: BookSearchWithReadProgress,
pageable: Pageable
): Page<BookDto> {
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) {

View file

@ -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() }))

View file

@ -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<Media.Status>?,
@RequestParam(name = "deleted", required = false) deleted: Boolean?,
@RequestParam(name = "unpaged", required = false) unpaged: Boolean = false,
@Parameter(hidden = true) page: Pageable
): Page<BookDto> =
@ -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) }

View file

@ -171,6 +171,7 @@ class SeriesCollectionController(
@RequestParam(name = "tag", required = false) tags: List<String>?,
@RequestParam(name = "age_rating", required = false) ageRatings: List<String>?,
@RequestParam(name = "release_year", required = false) release_years: List<String>?,
@RequestParam(name = "deleted", required = false) deleted: Boolean?,
@RequestParam(name = "unpaged", required = false) unpaged: Boolean = false,
@Parameter(hidden = true) @Authors authors: List<Author>?,
@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,

View file

@ -107,6 +107,7 @@ class SeriesController(
@RequestParam(name = "tag", required = false) tags: List<String>?,
@RequestParam(name = "age_rating", required = false) ageRatings: List<String>?,
@RequestParam(name = "release_year", required = false) release_years: List<String>?,
@RequestParam(name = "deleted", required = false) deleted: Boolean?,
@RequestParam(name = "unpaged", required = false) unpaged: Boolean = false,
@Parameter(hidden = true) @Authors authors: List<Author>?,
@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<String>?,
@RequestParam(name = "deleted", required = false) deleted: Boolean?,
@RequestParam(name = "unpaged", required = false) unpaged: Boolean = false,
@Parameter(hidden = true) page: Pageable
): Page<SeriesDto> {
@ -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<String>?,
@RequestParam(name = "deleted", required = false) deleted: Boolean?,
@RequestParam(name = "unpaged", required = false) unpaged: Boolean = false,
@Parameter(hidden = true) page: Pageable
): Page<SeriesDto> {
@ -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<String>?,
@RequestParam(name = "deleted", required = false) deleted: Boolean?,
@RequestParam(name = "unpaged", required = false) unpaged: Boolean = false,
@Parameter(hidden = true) page: Pageable
): Page<SeriesDto> {
@ -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<Media.Status>?,
@RequestParam(name = "read_status", required = false) readStatus: List<ReadStatus>?,
@RequestParam(name = "tag", required = false) tags: List<String>?,
@RequestParam(name = "deleted", required = false) deleted: Boolean?,
@RequestParam(name = "unpaged", required = false) unpaged: Boolean = false,
@Parameter(hidden = true) @Authors authors: List<Author>?,
@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,

View file

@ -15,7 +15,8 @@ interface BookDtoRepository {
readListId: String,
userId: String,
filterOnLibraryIds: Collection<String>?,
pageable: Pageable
search: BookSearchWithReadProgress,
pageable: Pageable,
): Page<BookDto>
fun findByIdOrNull(bookId: String, userId: String): BookDto?