Travel list ordering and filtering
This commit is contained in:
@@ -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>
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,4 +35,8 @@ class ListTravels(private val travelRepository: TravelRepository) {
|
||||
)
|
||||
).toList()
|
||||
}
|
||||
|
||||
fun countTravels(filter: String?): Long {
|
||||
return travelRepository.countTravels(filter ?: "")
|
||||
}
|
||||
}
|
||||
@@ -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 ?: "")
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user