Skip to content

Commit

Permalink
feat(JAQPOT-165): allow sorting on all paginated endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
alarv committed Jul 24, 2024
1 parent 9aef7da commit 144c955
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 12 deletions.
12 changes: 8 additions & 4 deletions src/main/kotlin/org/jaqpot/api/service/dataset/DatasetService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,18 @@ import org.jaqpot.api.model.DatasetDto
import org.jaqpot.api.model.GetDatasets200ResponseDto
import org.jaqpot.api.repository.DatasetRepository
import org.jaqpot.api.service.authentication.AuthenticationFacade
import org.jaqpot.api.service.util.SortUtil.Companion.parseSortParameters
import org.springframework.data.domain.PageRequest
import org.springframework.data.domain.Sort
import org.springframework.http.ResponseEntity
import org.springframework.security.access.prepost.PostAuthorize
import org.springframework.stereotype.Service

@Service
class DatasetService(private val datasetRepository: DatasetRepository, private val authenticationFacade: AuthenticationFacade) : DatasetApiDelegate {
class DatasetService(
private val datasetRepository: DatasetRepository,
private val authenticationFacade: AuthenticationFacade
) : DatasetApiDelegate {

@PostAuthorize("@getDatasetAuthorizationLogic.decide(#root)")
override fun getDatasetById(id: Long): ResponseEntity<DatasetDto> {
Expand All @@ -25,10 +30,9 @@ class DatasetService(private val datasetRepository: DatasetRepository, private v
.orElse(ResponseEntity.notFound().build())
}

override fun getDatasets(page: kotlin.Int,
size: kotlin.Int): ResponseEntity<GetDatasets200ResponseDto> {
override fun getDatasets(page: Int, size: Int, sort: List<String>?): ResponseEntity<GetDatasets200ResponseDto> {
val userId = authenticationFacade.userId
val pageable = PageRequest.of(page, size)
val pageable = PageRequest.of(page, size, Sort.by(parseSortParameters(sort)))
val datasets = datasetRepository.findAllByUserId(userId, pageable)

return ResponseEntity.ok().body(datasets.toGetDatasets200ResponseDto())
Expand Down
24 changes: 16 additions & 8 deletions src/main/kotlin/org/jaqpot/api/service/model/ModelService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,12 @@ import org.jaqpot.api.service.authentication.UserService
import org.jaqpot.api.service.dataset.csv.CSVDataConverter
import org.jaqpot.api.service.dataset.csv.CSVParser
import org.jaqpot.api.service.ratelimit.WithRateLimitProtectionByUser
import org.jaqpot.api.service.util.SortUtil.Companion.parseSortParameters
import org.jaqpot.api.storage.StorageService
import org.springframework.cache.annotation.CacheEvict
import org.springframework.cache.annotation.Cacheable
import org.springframework.data.domain.PageRequest
import org.springframework.data.domain.Sort
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.security.access.prepost.PostAuthorize
Expand All @@ -50,18 +52,18 @@ class ModelService(
) : ModelApiDelegate {


override fun getModels(page: Int, size: Int): ResponseEntity<GetModels200ResponseDto> {
override fun getModels(page: Int, size: Int, sort: List<String>?): ResponseEntity<GetModels200ResponseDto> {
val creatorId = authenticationFacade.userId
val pageable = PageRequest.of(page, size)
val pageable = PageRequest.of(page, size, Sort.by(parseSortParameters(sort)))
val modelsPage = modelRepository.findAllByCreatorId(creatorId, pageable)
val creator = userService.getUserById(creatorId).orElse(UserDto(creatorId))

return ResponseEntity.ok().body(modelsPage.toGetModels200ResponseDto(creator))
}

override fun getSharedModels(page: Int, size: Int): ResponseEntity<GetModels200ResponseDto> {
override fun getSharedModels(page: Int, size: Int, sort: List<String>?): ResponseEntity<GetModels200ResponseDto> {
val creatorId = authenticationFacade.userId
val pageable = PageRequest.of(page, size)
val pageable = PageRequest.of(page, size, Sort.by(parseSortParameters(sort)))
val sharedModelsPage = modelRepository.findAllSharedWithUser(creatorId, pageable)

return ResponseEntity.ok().body(sharedModelsPage.toGetModels200ResponseDto(null))
Expand Down Expand Up @@ -231,21 +233,27 @@ class ModelService(
override fun getAllAssociatedModels(
orgName: String,
page: Int,
size: Int
size: Int,
sort: List<String>?
): ResponseEntity<GetModels200ResponseDto> {
val organization = organizationRepository.findByName(orgName).orElseThrow {
throw ResponseStatusException(HttpStatus.NOT_FOUND, "Organization with name $orgName not found")
}

val pageable = PageRequest.of(page, size)
val pageable = PageRequest.of(page, size, Sort.by(parseSortParameters(sort)))
val modelsPage = modelRepository.findAllByAssociatedOrganizationId(organization.id!!, pageable)
return ResponseEntity.ok(modelsPage.toGetModels200ResponseDto(null))
}

@Cacheable(CacheKeys.SEARCH_MODELS)
override fun searchModels(query: String, page: Int, size: Int): ResponseEntity<GetModels200ResponseDto> {
override fun searchModels(
query: String,
page: Int,
size: Int,
sort: List<String>?
): ResponseEntity<GetModels200ResponseDto> {
val transformedQuery = FullTextUtil.transformSearchQuery(query)
val pageable = PageRequest.of(page, size)
val pageable = PageRequest.of(page, size, Sort.by(parseSortParameters(sort)))
val modelsPage = modelRepository.searchModelsBy(transformedQuery, pageable)
return ResponseEntity.ok(modelsPage.toGetModels200ResponseDto(null))
}
Expand Down
25 changes: 25 additions & 0 deletions src/main/kotlin/org/jaqpot/api/service/util/SortUtil.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.jaqpot.api.service.util

import org.springframework.data.domain.Sort
import org.springframework.data.domain.Sort.Order

class SortUtil {
companion object {
fun parseSortParameters(sortParams: List<String>?): List<Order> {
if (sortParams.isNullOrEmpty()) {
return listOf()
}

return sortParams
.map { sortParam: String ->
val parts = sortParam.split(",".toRegex()).dropLastWhile { it.isEmpty() }
.toTypedArray()
if (parts.size == 2) {
return@map Order(Sort.Direction.fromString(parts[1]), parts[0])
} else {
return@map Order(Sort.Direction.ASC, parts[0]) // Default to ascending
}
}
}
}
}
40 changes: 40 additions & 0 deletions src/main/resources/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@ paths:
schema:
type: integer
default: 10
- name: sort
in: query
required: false
schema:
type: array
items:
type: string
example: [ "field1,asc", "field2,desc" ]
responses:
'200':
description: Paginated list of models
Expand Down Expand Up @@ -113,6 +121,14 @@ paths:
schema:
type: integer
default: 10
- name: sort
in: query
required: false
schema:
type: array
items:
type: string
example: [ "field1,asc", "field2,desc" ]
responses:
'200':
description: Paginated list of models
Expand Down Expand Up @@ -157,6 +173,14 @@ paths:
schema:
type: integer
default: 10
- name: sort
in: query
required: false
schema:
type: array
items:
type: string
example: [ "field1,asc", "field2,desc" ]
responses:
'200':
description: Paginated list of shared models
Expand Down Expand Up @@ -461,6 +485,14 @@ paths:
schema:
type: integer
default: 10
- name: sort
in: query
required: false
schema:
type: array
items:
type: string
example: [ "field1,asc", "field2,desc" ]
responses:
'200':
description: Successful Response
Expand Down Expand Up @@ -725,6 +757,14 @@ paths:
schema:
type: integer
default: 10
- name: sort
in: query
required: false
schema:
type: array
items:
type: string
example: [ "field1,asc", "field2,desc" ]
responses:
"200":
description: "Models retrieved successfully"
Expand Down

0 comments on commit 144c955

Please sign in to comment.