Travel list ordering and filtering

This commit is contained in:
2021-03-31 14:57:00 +02:00
parent dab3b59ef0
commit bff282d0eb
5 changed files with 114 additions and 13 deletions

View File

@@ -10,6 +10,47 @@ import org.springframework.data.repository.PagingAndSortingRepository
import org.springframework.data.repository.query.Param
interface TravelRepository : PagingAndSortingRepository<Travel, TravelId> {
@Query("SELECT count(t) FROM Travel t " +
"LEFT JOIN t.travelers u " +
"WHERE (lower(t.origin) LIKE lower(concat('%', :filter,'%')) OR " +
"lower(t.destination) LIKE lower(concat('%', :filter,'%')))")
fun countTravels(
@Param("filter") filter: String
): Long
@Query("SELECT t FROM Travel t " +
"LEFT JOIN t.travelers u " +
"WHERE t.driver.id = :userId OR u.id = :userId")
fun findUserTravels(@Param("userId") userId: UserId): List<Travel>
@Query("SELECT count(t) FROM Travel t " +
"LEFT JOIN t.travelers u " +
"WHERE t.driver.id = :userId OR u.id = :userId")
fun countUserTravels(@Param("userId") userId: UserId): Long
@Query("SELECT t FROM Travel t " +
"LEFT JOIN t.travelers u " +
"WHERE (t.driver.id = :userId OR u.id = :userId) " +
"AND " +
"(lower(t.origin) LIKE lower(concat('%', :filter,'%')) OR " +
"lower(t.destination) LIKE lower(concat('%', :filter,'%')))")
fun findUserTravels(
@Param("userId") userId: UserId,
@Param("filter") filter: String,
pageable: Pageable
): Page<Travel>
@Query("SELECT count(t) FROM Travel t " +
"LEFT JOIN t.travelers u " +
"WHERE (t.driver.id = :userId OR u.id = :userId) " +
"AND " +
"(lower(t.origin) LIKE lower(concat('%', :filter,'%')) OR " +
"lower(t.destination) LIKE lower(concat('%', :filter,'%')))")
fun countUserTravels(
@Param("userId") userId: UserId,
@Param("filter") filter: String
): Long
@Query("SELECT t FROM Travel t WHERE t.driver.id = :userId")
fun findUserTravelsAsDriver(@Param("userId") userId: UserId): List<Travel>
@@ -23,6 +64,6 @@ interface TravelRepository : PagingAndSortingRepository<Travel, TravelId> {
fun countUserTravelsAsTraveler(@Param("userId") userId: UserId): Long
fun findByOriginContainingOrDestinationContainingAllIgnoreCase(
filter: String, filter2: String, pageable: Pageable
filterOrigin: String, filterDestination: String, pageable: Pageable
): Page<Travel>
}

View File

@@ -9,7 +9,6 @@ import eu.fosil.okupamicoche.repositories.UserRepository
import eu.fosil.okupamicoche.spring.services.AuthService
import eu.fosil.okupamicoche.spring.services.UseCaseService
import eu.fosil.okupamicoche.usecases.travel.*
import mu.KotlinLogging
import org.springframework.data.repository.findByIdOrNull
import org.springframework.validation.annotation.Validated
import org.springframework.web.bind.annotation.RequestBody
@@ -26,7 +25,7 @@ class PrivateTravelRestController(
private val travelRepository: TravelRepository,
private val useCaseService: UseCaseService
) : ApiRestController {
private val logger = KotlinLogging.logger {}
// private val logger = KotlinLogging.logger {}
@RequestMapping("/create")
suspend fun createTravel(@RequestBody @Validated travel: TravelDto, principal: Principal): ApiResponse<Unit> {
@@ -67,6 +66,25 @@ class PrivateTravelRestController(
}
@RequestMapping("/listusertravels")
suspend fun listUserTravels(
@RequestParam @Validated filter: String?,
@RequestParam @Validated sortColumn: String?,
@RequestParam @Validated sortAscending: Boolean?,
@RequestParam @Validated pageIndex: Int?,
@RequestParam @Validated pageSize: Int?,
principal: Principal
): ApiResponse<ListDto<TravelDto>> {
return response {
val userId = authService.currentUser(principal).id
val useCase = ListUserTravels(travelRepository)
val travels = useCase.listUserTravels(
userId, filter, sortColumn, sortAscending, pageIndex, pageSize
).map { t -> TravelDto(t) }
ListDto(useCase.countUserTravels(userId, filter), travels)
}
}
@RequestMapping("/listallusertravels")
suspend fun listUserTravels(principal: Principal): ApiResponse<ListDto<TravelDto>> {
return response {
val userId = authService.currentUser(principal).id

View File

@@ -25,10 +25,19 @@ class PublicRestController(private val travelRepository: TravelRepository) : Api
@RequestParam @Validated pageSize: Int?,
): ApiResponse<ListDto<TravelDto>> {
return response {
val travels =
ListTravels(travelRepository).listTravels(
filter, sortColumn, sortAscending, pageIndex, pageSize
).map { t -> TravelDto(t) }
val usecase = ListTravels(travelRepository)
val count = usecase.countTravels(filter)
val travels = usecase.listTravels(
filter, sortColumn, sortAscending, pageIndex, pageSize
).map { t -> TravelDto(t) }
ListDto(count, travels)
}
}
@RequestMapping("/listall")
suspend fun listTravels(): ApiResponse<ListDto<TravelDto>> {
return response {
val travels = ListTravels(travelRepository).listTravels().map { t -> TravelDto(t) }
ListDto(travelRepository.count(), travels)
}
}

View File

@@ -35,4 +35,8 @@ class ListTravels(private val travelRepository: TravelRepository) {
)
).toList()
}
fun countTravels(filter: String?): Long {
return travelRepository.countTravels(filter ?: "")
}
}

View File

@@ -3,17 +3,46 @@ package eu.fosil.okupamicoche.usecases.travel
import eu.fosil.okupamicoche.entities.Travel
import eu.fosil.okupamicoche.entities.UserId
import eu.fosil.okupamicoche.repositories.TravelRepository
import org.springframework.data.domain.PageRequest
import org.springframework.data.domain.Sort
class ListUserTravels(private val travelRepository: TravelRepository) {
fun listUserTravels(idUser: UserId): List<Travel> {
return listOf(
travelRepository.findUserTravelsAsDriver(idUser),
travelRepository.findUserTravelsAsTraveler(idUser)
).flatten()
return travelRepository.findUserTravels(idUser)
}
fun countUserTravels(idUser: UserId): Long {
return travelRepository.countUserTravelsAsDriver(idUser) +
travelRepository.countUserTravelsAsTraveler(idUser)
return travelRepository.countUserTravels(idUser)
}
fun listUserTravels(
userId: UserId,
filter: String?,
sortColumn: String?,
sortAscending: Boolean?,
pageIndex: Int?,
pageSize: Int?
): List<Travel> {
val sort = if (sortColumn == null) {
Sort.unsorted()
} else {
Sort.by(
if (sortAscending != false) Sort.Direction.ASC else Sort.Direction.DESC,
sortColumn
)
}
return travelRepository.findUserTravels(
userId,
filter ?: "",
PageRequest.of(
pageIndex ?: 0,
pageSize ?: 10,
sort
)
).toList()
}
fun countUserTravels(idUser: UserId, filter: String?): Long {
return travelRepository.countUserTravels(idUser, filter ?: "")
}
}