From 8f8054e1d859928cc249cb5631283da498be908d Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Fri, 14 Aug 2020 16:33:32 +0800 Subject: [PATCH] feat(api): unpaged queries for books --- .../komga/infrastructure/jooq/BookDtoDao.kt | 8 +++-- .../komga/interfaces/rest/BookController.kt | 34 +++++++++++++------ .../komga/interfaces/rest/SeriesController.kt | 17 ++++++---- 3 files changed, 39 insertions(+), 20 deletions(-) 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 1c4110bd3..ed7baf704 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 @@ -24,6 +24,7 @@ import org.springframework.data.domain.Page import org.springframework.data.domain.PageImpl import org.springframework.data.domain.PageRequest import org.springframework.data.domain.Pageable +import org.springframework.data.domain.Sort import org.springframework.stereotype.Component import java.net.URL @@ -71,13 +72,14 @@ class BookDtoDao( val dtos = selectBase(userId) .where(conditions) .orderBy(orderBy) - .limit(pageable.pageSize) - .offset(pageable.offset) + .apply { if (pageable.isPaged) limit(pageable.pageSize).offset(pageable.offset) } .fetchAndMap() + val pageSort = if (orderBy.size > 1) pageable.sort else Sort.unsorted() return PageImpl( dtos, - PageRequest.of(pageable.pageNumber, pageable.pageSize, pageable.sort), + if (pageable.isPaged) PageRequest.of(pageable.pageNumber, pageable.pageSize, pageSort) + else PageRequest.of(0, maxOf(count.toInt(), 20), pageSort), count.toLong() ) } diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/BookController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/BookController.kt index de0cfb330..7974805f7 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/BookController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/BookController.kt @@ -22,6 +22,7 @@ import org.gotson.komga.domain.persistence.BookRepository import org.gotson.komga.domain.persistence.MediaRepository import org.gotson.komga.domain.service.BookLifecycle import org.gotson.komga.infrastructure.image.ImageType +import org.gotson.komga.infrastructure.jooq.UnpagedSorted import org.gotson.komga.infrastructure.security.KomgaPrincipal import org.gotson.komga.infrastructure.swagger.PageableAsQueryParam import org.gotson.komga.infrastructure.swagger.PageableWithoutSortAsQueryParam @@ -84,14 +85,20 @@ class BookController( @RequestParam(name = "library_id", required = false) libraryIds: List?, @RequestParam(name = "media_status", required = false) mediaStatus: List?, @RequestParam(name = "read_status", required = false) readStatus: List?, + @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @Parameter(hidden = true) page: Pageable ): Page { - val pageRequest = PageRequest.of( - page.pageNumber, - page.pageSize, - if (page.sort.isSorted) Sort.by(page.sort.map { it.ignoreCase() }.toList()) - else Sort.by(Sort.Order.asc("metadata.title").ignoreCase()) - ) + val sort = + if (page.sort.isSorted) page.sort + else Sort.by(Sort.Order.asc("metadata.title")) + + val pageRequest = + if (unpaged) UnpagedSorted(sort) + else PageRequest.of( + page.pageNumber, + page.pageSize, + sort + ) val bookSearch = BookSearchWithReadProgress( libraryIds = principal.user.getAuthorizedLibraryIds(libraryIds), @@ -110,13 +117,18 @@ class BookController( @GetMapping("api/v1/books/latest") fun getLatestBooks( @AuthenticationPrincipal principal: KomgaPrincipal, + @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @Parameter(hidden = true) page: Pageable ): Page { - val pageRequest = PageRequest.of( - page.pageNumber, - page.pageSize, - Sort.by(Sort.Direction.DESC, "lastModifiedDate") - ) + val sort = Sort.by(Sort.Order.desc("lastModifiedDate")) + + val pageRequest = + if (unpaged) UnpagedSorted(sort) + else PageRequest.of( + page.pageNumber, + page.pageSize, + sort + ) return bookDtoRepository.findAll( BookSearchWithReadProgress( 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 bda6c4b9f..0fe574133 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 @@ -209,18 +209,23 @@ class SeriesController( @PathVariable(name = "seriesId") seriesId: String, @RequestParam(name = "media_status", required = false) mediaStatus: List?, @RequestParam(name = "read_status", required = false) readStatus: List?, + @RequestParam(name = "unpaged", required = false) unpaged: Boolean = false, @Parameter(hidden = true) page: Pageable ): Page { seriesRepository.getLibraryId(seriesId)?.let { if (!principal.user.canAccessLibrary(it)) throw ResponseStatusException(HttpStatus.FORBIDDEN) } ?: throw ResponseStatusException(HttpStatus.NOT_FOUND) - - val pageRequest = PageRequest.of( - page.pageNumber, - page.pageSize, - if (page.sort.isSorted) Sort.by(page.sort.map { it.ignoreCase() }.toList()) + val sort = + if (page.sort.isSorted) page.sort else Sort.by(Sort.Order.asc("metadata.numberSort")) - ) + + val pageRequest = + if (unpaged) UnpagedSorted(sort) + else PageRequest.of( + page.pageNumber, + page.pageSize, + sort + ) return bookDtoRepository.findAll( BookSearchWithReadProgress(