From bff282d0eb25f8251872ba743762126103ff1650 Mon Sep 17 00:00:00 2001 From: Eneko Date: Wed, 31 Mar 2021 14:57:00 +0200 Subject: [PATCH] Travel list ordering and filtering --- .../repositories/TravelRepository.kt | 43 ++++++++++++++++++- .../controller/PrivateTravelRestController.kt | 22 +++++++++- .../spring/controller/PublicRestController.kt | 17 ++++++-- .../usecases/travel/ListTravels.kt | 4 ++ .../usecases/travel/ListUserTravels.kt | 41 +++++++++++++++--- 5 files changed, 114 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/eu/fosil/okupamicoche/repositories/TravelRepository.kt b/src/main/kotlin/eu/fosil/okupamicoche/repositories/TravelRepository.kt index 297b332..5dbd34b 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/repositories/TravelRepository.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/repositories/TravelRepository.kt @@ -10,6 +10,47 @@ import org.springframework.data.repository.PagingAndSortingRepository import org.springframework.data.repository.query.Param interface TravelRepository : PagingAndSortingRepository { + @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 + + @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 + + @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 @@ -23,6 +64,6 @@ interface TravelRepository : PagingAndSortingRepository { fun countUserTravelsAsTraveler(@Param("userId") userId: UserId): Long fun findByOriginContainingOrDestinationContainingAllIgnoreCase( - filter: String, filter2: String, pageable: Pageable + filterOrigin: String, filterDestination: String, pageable: Pageable ): Page } \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PrivateTravelRestController.kt b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PrivateTravelRestController.kt index 97b36f5..690cb69 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PrivateTravelRestController.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PrivateTravelRestController.kt @@ -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 { @@ -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> { + 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> { return response { val userId = authService.currentUser(principal).id diff --git a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PublicRestController.kt b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PublicRestController.kt index aec68ef..bca8ed3 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PublicRestController.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PublicRestController.kt @@ -25,10 +25,19 @@ class PublicRestController(private val travelRepository: TravelRepository) : Api @RequestParam @Validated pageSize: Int?, ): ApiResponse> { 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> { + return response { + val travels = ListTravels(travelRepository).listTravels().map { t -> TravelDto(t) } ListDto(travelRepository.count(), travels) } } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/ListTravels.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/ListTravels.kt index 5ed92b1..49470e9 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/ListTravels.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/ListTravels.kt @@ -35,4 +35,8 @@ class ListTravels(private val travelRepository: TravelRepository) { ) ).toList() } + + fun countTravels(filter: String?): Long { + return travelRepository.countTravels(filter ?: "") + } } \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/ListUserTravels.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/ListUserTravels.kt index 1982bc1..19c5b00 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/ListUserTravels.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/ListUserTravels.kt @@ -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 { - 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 { + 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 ?: "") } } \ No newline at end of file