fix(swagger): fix incorrect Pageable schema

This commit is contained in:
Gauthier Roebroeck 2020-04-20 09:40:30 +08:00
parent 9bf37db38d
commit 14bee566b3
5 changed files with 60 additions and 23 deletions

View file

@ -53,7 +53,6 @@ dependencies {
run { run {
val springdocVersion = "1.3.3" val springdocVersion = "1.3.3"
implementation("org.springdoc:springdoc-openapi-ui:$springdocVersion") implementation("org.springdoc:springdoc-openapi-ui:$springdocVersion")
implementation("org.springdoc:springdoc-openapi-data-rest:$springdocVersion")
implementation("org.springdoc:springdoc-openapi-security:$springdocVersion") implementation("org.springdoc:springdoc-openapi-security:$springdocVersion")
} }

View file

@ -0,0 +1,48 @@
package org.gotson.komga.infrastructure.swagger
import io.swagger.v3.oas.annotations.Parameter
import io.swagger.v3.oas.annotations.Parameters
import io.swagger.v3.oas.annotations.enums.ParameterIn
import io.swagger.v3.oas.annotations.media.ArraySchema
import io.swagger.v3.oas.annotations.media.Content
import io.swagger.v3.oas.annotations.media.Schema
@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.FUNCTION)
@Parameters(
Parameter(
description = "Zero-based page index (0..N)",
`in` = ParameterIn.QUERY,
name = "page",
schema = Schema(type = "integer")
),
Parameter(
description = "The size of the page to be returned",
`in` = ParameterIn.QUERY,
name = "size",
schema = Schema(type = "integer")
)
)
annotation class PageableWithoutSortAsQueryParam
@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.FUNCTION)
@Parameters(
Parameter(
description = "Zero-based page index (0..N)",
`in` = ParameterIn.QUERY,
name = "page",
schema = Schema(type = "integer")
),
Parameter(
description = "The size of the page to be returned",
`in` = ParameterIn.QUERY,
name = "size",
schema = Schema(type = "integer")
),
Parameter(
description = "Sorting criteria in the format: property(,asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
`in` = ParameterIn.QUERY
, name = "sort"
, content = [Content(array = ArraySchema(schema = Schema(type = "string")))]
)
)
annotation class PageableAsQueryParam

View file

@ -1,13 +0,0 @@
package org.gotson.komga.infrastructure.swagger
import io.swagger.v3.oas.annotations.Parameter
import io.swagger.v3.oas.annotations.Parameters
import io.swagger.v3.oas.annotations.enums.ParameterIn
import io.swagger.v3.oas.annotations.media.Schema
@Target(AnnotationTarget.ANNOTATION_CLASS, AnnotationTarget.FUNCTION)
@Parameters(
Parameter(description = "Zero-based page index (0..N)", `in` = ParameterIn.QUERY, name = "page", schema = Schema(type = "integer", defaultValue = "0")),
Parameter(description = "The size of the page to be returned", `in` = ParameterIn.QUERY, name = "size", schema = Schema(type = "integer", defaultValue = "20"))
)
annotation class PageableWithoutSort

View file

@ -22,12 +22,12 @@ import org.gotson.komga.domain.model.Series
import org.gotson.komga.domain.persistence.BookRepository import org.gotson.komga.domain.persistence.BookRepository
import org.gotson.komga.infrastructure.image.ImageType import org.gotson.komga.infrastructure.image.ImageType
import org.gotson.komga.infrastructure.security.KomgaPrincipal import org.gotson.komga.infrastructure.security.KomgaPrincipal
import org.gotson.komga.infrastructure.swagger.PageableWithoutSort import org.gotson.komga.infrastructure.swagger.PageableAsQueryParam
import org.gotson.komga.infrastructure.swagger.PageableWithoutSortAsQueryParam
import org.gotson.komga.interfaces.rest.dto.BookDto import org.gotson.komga.interfaces.rest.dto.BookDto
import org.gotson.komga.interfaces.rest.dto.BookMetadataUpdateDto import org.gotson.komga.interfaces.rest.dto.BookMetadataUpdateDto
import org.gotson.komga.interfaces.rest.dto.PageDto import org.gotson.komga.interfaces.rest.dto.PageDto
import org.gotson.komga.interfaces.rest.dto.toDto import org.gotson.komga.interfaces.rest.dto.toDto
import org.springdoc.api.annotations.ParameterObject
import org.springframework.core.io.FileSystemResource import org.springframework.core.io.FileSystemResource
import org.springframework.data.domain.Page import org.springframework.data.domain.Page
import org.springframework.data.domain.PageRequest import org.springframework.data.domain.PageRequest
@ -72,13 +72,14 @@ class BookController(
private val asyncOrchestrator: AsyncOrchestrator private val asyncOrchestrator: AsyncOrchestrator
) { ) {
@PageableAsQueryParam
@GetMapping("api/v1/books") @GetMapping("api/v1/books")
fun getAllBooks( fun getAllBooks(
@AuthenticationPrincipal principal: KomgaPrincipal, @AuthenticationPrincipal principal: KomgaPrincipal,
@RequestParam(name = "search", required = false) searchTerm: String?, @RequestParam(name = "search", required = false) searchTerm: String?,
@RequestParam(name = "library_id", required = false) libraryIds: List<Long>?, @RequestParam(name = "library_id", required = false) libraryIds: List<Long>?,
@RequestParam(name = "media_status", required = false) mediaStatus: List<Media.Status>?, @RequestParam(name = "media_status", required = false) mediaStatus: List<Media.Status>?,
@ParameterObject page: Pageable @Parameter(hidden = true) page: Pageable
): Page<BookDto> { ): Page<BookDto> {
val pageRequest = PageRequest.of( val pageRequest = PageRequest.of(
page.pageNumber, page.pageNumber,
@ -123,7 +124,7 @@ class BookController(
@Operation(description = "Return newly added or updated books.") @Operation(description = "Return newly added or updated books.")
@PageableWithoutSort @PageableWithoutSortAsQueryParam
@GetMapping("api/v1/books/latest") @GetMapping("api/v1/books/latest")
fun getLatestSeries( fun getLatestSeries(
@AuthenticationPrincipal principal: KomgaPrincipal, @AuthenticationPrincipal principal: KomgaPrincipal,

View file

@ -17,7 +17,8 @@ import org.gotson.komga.domain.model.SeriesMetadata
import org.gotson.komga.domain.persistence.BookRepository import org.gotson.komga.domain.persistence.BookRepository
import org.gotson.komga.domain.persistence.SeriesRepository import org.gotson.komga.domain.persistence.SeriesRepository
import org.gotson.komga.infrastructure.security.KomgaPrincipal import org.gotson.komga.infrastructure.security.KomgaPrincipal
import org.gotson.komga.infrastructure.swagger.PageableWithoutSort import org.gotson.komga.infrastructure.swagger.PageableAsQueryParam
import org.gotson.komga.infrastructure.swagger.PageableWithoutSortAsQueryParam
import org.gotson.komga.interfaces.rest.dto.BookDto import org.gotson.komga.interfaces.rest.dto.BookDto
import org.gotson.komga.interfaces.rest.dto.SeriesDto import org.gotson.komga.interfaces.rest.dto.SeriesDto
import org.gotson.komga.interfaces.rest.dto.SeriesMetadataUpdateDto import org.gotson.komga.interfaces.rest.dto.SeriesMetadataUpdateDto
@ -108,7 +109,7 @@ class SeriesController(
} }
@Operation(description = "Return recently added or updated series.") @Operation(description = "Return recently added or updated series.")
@PageableWithoutSort @PageableWithoutSortAsQueryParam
@GetMapping("/latest") @GetMapping("/latest")
fun getLatestSeries( fun getLatestSeries(
@AuthenticationPrincipal principal: KomgaPrincipal, @AuthenticationPrincipal principal: KomgaPrincipal,
@ -128,7 +129,7 @@ class SeriesController(
} }
@Operation(description = "Return newly added series.") @Operation(description = "Return newly added series.")
@PageableWithoutSort @PageableWithoutSortAsQueryParam
@GetMapping("/new") @GetMapping("/new")
fun getNewSeries( fun getNewSeries(
@AuthenticationPrincipal principal: KomgaPrincipal, @AuthenticationPrincipal principal: KomgaPrincipal,
@ -148,7 +149,7 @@ class SeriesController(
} }
@Operation(description = "Return recently updated series, but not newly added ones.") @Operation(description = "Return recently updated series, but not newly added ones.")
@PageableWithoutSort @PageableWithoutSortAsQueryParam
@GetMapping("/updated") @GetMapping("/updated")
fun getUpdatedSeries( fun getUpdatedSeries(
@AuthenticationPrincipal principal: KomgaPrincipal, @AuthenticationPrincipal principal: KomgaPrincipal,
@ -191,12 +192,13 @@ class SeriesController(
} ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) } ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
} ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) } ?: throw ResponseStatusException(HttpStatus.NOT_FOUND)
@PageableAsQueryParam
@GetMapping("{seriesId}/books") @GetMapping("{seriesId}/books")
fun getAllBooksBySeries( fun getAllBooksBySeries(
@AuthenticationPrincipal principal: KomgaPrincipal, @AuthenticationPrincipal principal: KomgaPrincipal,
@PathVariable(name = "seriesId") id: Long, @PathVariable(name = "seriesId") id: Long,
@RequestParam(name = "media_status", required = false) mediaStatus: List<Media.Status>?, @RequestParam(name = "media_status", required = false) mediaStatus: List<Media.Status>?,
@ParameterObject page: Pageable @Parameter(hidden = true) page: Pageable
): Page<BookDto> { ): Page<BookDto> {
seriesRepository.findByIdOrNull(id)?.let { seriesRepository.findByIdOrNull(id)?.let {
if (!principal.user.canAccessSeries(it)) throw ResponseStatusException(HttpStatus.UNAUTHORIZED) if (!principal.user.canAccessSeries(it)) throw ResponseStatusException(HttpStatus.UNAUTHORIZED)