feat(api): add released_after query parameter for /books endpoint

This commit is contained in:
Gauthier Roebroeck 2021-07-19 14:14:59 +08:00
parent 0f4b22615d
commit f6dc546fd9
4 changed files with 12 additions and 1 deletions

View file

@ -1,11 +1,14 @@
package org.gotson.komga.domain.model package org.gotson.komga.domain.model
import java.time.LocalDate
open class BookSearch( open class BookSearch(
val libraryIds: Collection<String>? = null, val libraryIds: Collection<String>? = null,
val seriesIds: Collection<String>? = null, val seriesIds: Collection<String>? = null,
val searchTerm: String? = null, val searchTerm: String? = null,
val mediaStatus: Collection<Media.Status>? = null, val mediaStatus: Collection<Media.Status>? = null,
val deleted: Boolean? = null, val deleted: Boolean? = null,
val releasedAfter: LocalDate? = null,
) )
class BookSearchWithReadProgress( class BookSearchWithReadProgress(
@ -14,6 +17,7 @@ class BookSearchWithReadProgress(
searchTerm: String? = null, searchTerm: String? = null,
mediaStatus: Collection<Media.Status>? = null, mediaStatus: Collection<Media.Status>? = null,
deleted: Boolean? = null, deleted: Boolean? = null,
releasedAfter: LocalDate? = null,
val tags: Collection<String>? = null, val tags: Collection<String>? = null,
val readStatus: Collection<ReadStatus>? = null, val readStatus: Collection<ReadStatus>? = null,
val authors: Collection<Author>? = null, val authors: Collection<Author>? = null,
@ -22,5 +26,6 @@ class BookSearchWithReadProgress(
seriesIds = seriesIds, seriesIds = seriesIds,
searchTerm = searchTerm, searchTerm = searchTerm,
mediaStatus = mediaStatus, mediaStatus = mediaStatus,
deleted = deleted deleted = deleted,
releasedAfter = releasedAfter,
) )

View file

@ -285,6 +285,7 @@ class BookDao(
if (!mediaStatus.isNullOrEmpty()) c = c.and(m.STATUS.`in`(mediaStatus)) if (!mediaStatus.isNullOrEmpty()) c = c.and(m.STATUS.`in`(mediaStatus))
if (deleted == true) c = c.and(b.DELETED_DATE.isNotNull) if (deleted == true) c = c.and(b.DELETED_DATE.isNotNull)
if (deleted == false) c = c.and(b.DELETED_DATE.isNull) if (deleted == false) c = c.and(b.DELETED_DATE.isNull)
if (releasedAfter != null) c = c.and(d.RELEASE_DATE.gt(releasedAfter))
return c return c
} }

View file

@ -270,6 +270,7 @@ class BookDtoDao(
if (!mediaStatus.isNullOrEmpty()) c = c.and(m.STATUS.`in`(mediaStatus)) if (!mediaStatus.isNullOrEmpty()) c = c.and(m.STATUS.`in`(mediaStatus))
if (deleted == true) c = c.and(b.DELETED_DATE.isNotNull) if (deleted == true) c = c.and(b.DELETED_DATE.isNotNull)
if (deleted == false) c = c.and(b.DELETED_DATE.isNull) if (deleted == false) c = c.and(b.DELETED_DATE.isNull)
if (releasedAfter != null) c = c.and(d.RELEASE_DATE.gt(releasedAfter))
if (!tags.isNullOrEmpty()) c = c.and(lower(bt.TAG).`in`(tags.map { it.lowercase() })) if (!tags.isNullOrEmpty()) c = c.and(lower(bt.TAG).`in`(tags.map { it.lowercase() }))
if (readStatus != null) { if (readStatus != null) {

View file

@ -48,6 +48,7 @@ import org.springframework.data.domain.Page
import org.springframework.data.domain.PageRequest import org.springframework.data.domain.PageRequest
import org.springframework.data.domain.Pageable import org.springframework.data.domain.Pageable
import org.springframework.data.domain.Sort import org.springframework.data.domain.Sort
import org.springframework.format.annotation.DateTimeFormat
import org.springframework.http.ContentDisposition import org.springframework.http.ContentDisposition
import org.springframework.http.HttpHeaders import org.springframework.http.HttpHeaders
import org.springframework.http.HttpStatus import org.springframework.http.HttpStatus
@ -71,6 +72,7 @@ import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBo
import java.io.FileNotFoundException import java.io.FileNotFoundException
import java.io.OutputStream import java.io.OutputStream
import java.nio.file.NoSuchFileException import java.nio.file.NoSuchFileException
import java.time.LocalDate
import java.time.ZoneOffset import java.time.ZoneOffset
import javax.validation.Valid import javax.validation.Valid
import kotlin.io.path.name import kotlin.io.path.name
@ -99,6 +101,7 @@ class BookController(
@RequestParam(name = "library_id", required = false) libraryIds: List<String>?, @RequestParam(name = "library_id", required = false) libraryIds: List<String>?,
@RequestParam(name = "media_status", required = false) mediaStatus: List<Media.Status>?, @RequestParam(name = "media_status", required = false) mediaStatus: List<Media.Status>?,
@RequestParam(name = "read_status", required = false) readStatus: List<ReadStatus>?, @RequestParam(name = "read_status", required = false) readStatus: List<ReadStatus>?,
@RequestParam(name = "released_after", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) releasedAfter: LocalDate?,
@RequestParam(name = "tag", required = false) tags: List<String>?, @RequestParam(name = "tag", required = false) tags: List<String>?,
@RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false,
@Parameter(hidden = true) page: Pageable @Parameter(hidden = true) page: Pageable
@ -120,6 +123,7 @@ class BookController(
searchTerm = searchTerm, searchTerm = searchTerm,
mediaStatus = mediaStatus, mediaStatus = mediaStatus,
readStatus = readStatus, readStatus = readStatus,
releasedAfter = releasedAfter,
tags = tags tags = tags
) )