diff --git a/CHANGELOG.md b/CHANGELOG.md index 87220ca53e75c7b21a48f2bb5509f8e2e6142945..168c4dea3982d44d0579c17180108d229dadf972 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ +## [1.0.71-RELEASE] ### Added -- New features that have been added. +- MYD-628/add pagination, sort and search for sale ssesion ### Changed - Changes in existing functionality. diff --git a/src/main/java/com/marketingconfort/mydressin/constants/Paths.java b/src/main/java/com/marketingconfort/mydressin/constants/Paths.java index ba74ada440d1bcbce8067b03a4df01773f1d19ab..503aacd584365a56bcad191418fb794cb4b9d533 100644 --- a/src/main/java/com/marketingconfort/mydressin/constants/Paths.java +++ b/src/main/java/com/marketingconfort/mydressin/constants/Paths.java @@ -27,4 +27,6 @@ public class Paths { public static final String ADD_TO_CART_TRENDS = "/add-to-cart-trends"; public static final String CART_COUNT = "/cart-count"; public static final String THEORETICAL_AMOUNT = "/theoretical-amount"; + public static final String SALE_SESSION_PAGE = "/page"; + public static final String COUNT_TYPE_SALE_SESSION = "/count-type"; } diff --git a/src/main/java/com/marketingconfort/mydressin/controllers/SaleSessionController.java b/src/main/java/com/marketingconfort/mydressin/controllers/SaleSessionController.java index 73842d30e75488f3321e6a4bc88be03cfb5ab5b0..6d60f5bc015fdb102072b73362d1a37d009123c6 100644 --- a/src/main/java/com/marketingconfort/mydressin/controllers/SaleSessionController.java +++ b/src/main/java/com/marketingconfort/mydressin/controllers/SaleSessionController.java @@ -1,6 +1,7 @@ package com.marketingconfort.mydressin.controllers; import com.marketingconfort.mydressin.common.cart.models.SaleSession; +import com.marketingconfort.mydressin.constants.Paths; import com.marketingconfort.mydressin.dtos.SaleSessionDTO; import com.marketingconfort.mydressin.dtos.SessionOrderDTO; import com.marketingconfort.mydressin.dtos.ItemRequestDTO; @@ -9,12 +10,15 @@ import com.marketingconfort.mydressin.exceptions.SaleSessionExpiredException; import com.marketingconfort.mydressin.exceptions.SaleSessionNotFoundException; import com.marketingconfort.mydressin.services.SaleSessionService; import lombok.AllArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import java.time.LocalDateTime; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -22,7 +26,6 @@ import java.util.concurrent.CompletableFuture; @RestController @RequestMapping(value = "/api/cart", method = RequestMethod.OPTIONS) @AllArgsConstructor - public class SaleSessionController { private final SaleSessionService saleSessionService; @@ -138,5 +141,33 @@ public class SaleSessionController { SaleSessionDTO updatedSession = saleSessionService.restockSaleSession(sessionId); return ResponseEntity.ok(updatedSession); } + + @GetMapping(Paths.SALE_SESSION_PAGE) + @PreAuthorize("@securityCustomExpressions.isClientTrusted(#requestAuthorization)") + public Page<SaleSessionDTO> getSaleSessionsPage( + @RequestParam(required = false) String name, + @RequestParam(required = false) String type, + @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date startDate, + @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date endDate, + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size, + @RequestParam(defaultValue = "id") String sortBy, + @RequestParam(defaultValue = "ASC") String sortDir, + @RequestHeader String requestAuthorization) { + + return saleSessionService.getSaleSessionsPage(name, type, startDate, endDate, page, size, sortBy, sortDir); + } + + @GetMapping(Paths.COUNT_TYPE_SALE_SESSION) + @PreAuthorize("@securityCustomExpressions.isClientTrusted(#requestAuthorization)") + public List<String[]> getStatusCount( + @RequestParam(required = false) String name, + @RequestParam(required = false) String type, + @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date startDate, + @RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) Date endDate, + @RequestHeader String requestAuthorization) { + return saleSessionService.getTypeCount(name, type, startDate, endDate); + } + } diff --git a/src/main/java/com/marketingconfort/mydressin/repositories/SaleSessionRepository.java b/src/main/java/com/marketingconfort/mydressin/repositories/SaleSessionRepository.java index 650fb3fdb28f95338e70a148c4561c42c308b269..84317f3a1d3ae691a00bdabc0a97a19712e27918 100644 --- a/src/main/java/com/marketingconfort/mydressin/repositories/SaleSessionRepository.java +++ b/src/main/java/com/marketingconfort/mydressin/repositories/SaleSessionRepository.java @@ -2,11 +2,14 @@ package com.marketingconfort.mydressin.repositories; import com.marketingconfort.mydressin.common.cart.enumurations.ItemCartStatus; import com.marketingconfort.mydressin.common.cart.models.SaleSession; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.util.Date; import java.util.List; @Repository @@ -68,4 +71,26 @@ public interface SaleSessionRepository extends JpaRepository<SaleSession, Long> "JOIN so.itemCart ic " + "WHERE ss.id = :sessionId") Long getTotalPaidProducts(@Param("sessionId") Long sessionId); + + @Query("SELECT sl FROM SaleSession sl WHERE " + + "(:name IS NULL OR :name = '' OR LOWER(sl.name) LIKE LOWER(CONCAT('%', :name, '%'))) " + + "AND (:type IS NULL OR :type = '' OR LOWER(sl.type) like LOWER(CONCAT('%', :type,'%')))" + + "AND ( CAST(:startDate as string) IS NULL OR CAST(sl.startedDate as date) BETWEEN :startDate AND :endDate)" + + "AND sl.status != 'DELETED' ") + Page<SaleSession> getSaleSessionsPage(@Param("type") String type, + @Param("name") String name , + @Param("startDate") Date startDate , + @Param("endDate") Date endDate , + Pageable pageable); + + @Query("SELECT sl.type, COUNT(sl) FROM SaleSession sl WHERE " + + "(:name IS NULL OR :name = '' OR LOWER(sl.name) LIKE LOWER(CONCAT('%', :name, '%'))) " + + "AND (:type IS NULL OR :type = '' OR LOWER(sl.type) like LOWER(CONCAT('%', :type,'%')))" + + "AND ( CAST(:startDate as string) IS NULL OR CAST(sl.startedDate as date) BETWEEN :startDate AND :endDate)" + + "AND sl.status != 'DELETED' " + + "GROUP BY sl.type") + List<Object[]> getTypeCount(@Param("type") String type, + @Param("name") String name , + @Param("startDate") Date startDate , + @Param("endDate") Date endDate); } diff --git a/src/main/java/com/marketingconfort/mydressin/services/SaleSessionService.java b/src/main/java/com/marketingconfort/mydressin/services/SaleSessionService.java index 14bff7e90379851c63cf98bbbeae9a821031fa71..3f86b8917530ef170519cd131738b650d87f4256 100644 --- a/src/main/java/com/marketingconfort/mydressin/services/SaleSessionService.java +++ b/src/main/java/com/marketingconfort/mydressin/services/SaleSessionService.java @@ -6,10 +6,12 @@ import com.marketingconfort.mydressin.dtos.SaleSessionDTO; import com.marketingconfort.mydressin.dtos.SessionOrderDTO; import com.marketingconfort.mydressin.dtos.ItemRequestDTO; import com.marketingconfort.mydressin.exceptions.SaleSessionExpiredException; +import org.springframework.data.domain.Page; import java.time.LocalDateTime; +import java.util.Date; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -29,4 +31,7 @@ public interface SaleSessionService { SaleSessionDTO updateSaleSessionDetails(Long sessionId, String newName, String newDescription); boolean deleteSaleSessionById(Long sessionId); SaleSessionDTO restockSaleSession(Long sessionId); + Page<SaleSessionDTO> getSaleSessionsPage(String name , String type, Date startDate, Date endDate, + int page, int size, String sortBy, String order); + List<String[]> getTypeCount(String name , String type, Date startDate, Date endDate); } diff --git a/src/main/java/com/marketingconfort/mydressin/services/impl/SaleSessionServiceImp.java b/src/main/java/com/marketingconfort/mydressin/services/impl/SaleSessionServiceImp.java index cc5ef6afe44d2529c664a6f095afebaecb52aae7..86e8f0840a5007c9874f14785ee8f4df661e2aed 100644 --- a/src/main/java/com/marketingconfort/mydressin/services/impl/SaleSessionServiceImp.java +++ b/src/main/java/com/marketingconfort/mydressin/services/impl/SaleSessionServiceImp.java @@ -19,16 +19,17 @@ import com.marketingconfort.mydressin.repositories.SaleSessionRepository; import com.marketingconfort.mydressin.repositories.SessionOrderRepository; import com.marketingconfort.mydressin.services.*; import lombok.AllArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; -import java.util.Optional; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -244,4 +245,42 @@ public class SaleSessionServiceImp implements SaleSessionService { SaleSession updatedSaleSession = saleSessionRepository.save(saleSession); return saleSessionMapper.toDTO(updatedSaleSession); } + + @Override + public Page<SaleSessionDTO> getSaleSessionsPage(String name, String type, Date startDate, Date endDate, int page, int size, String sortBy, String sortDir) { + if("createdAt".equals(sortBy)) + sortBy = "id"; + Sort.Direction direction = Sort.Direction.fromString(sortDir); + Pageable pageable = PageRequest.of(page, size, Sort.by(direction, sortBy)); + + return saleSessionRepository.getSaleSessionsPage(type,name,startDate,endDate,pageable) + .map(saleSessionMapper::toDTO); + } + + @Override + public List<String[]> getTypeCount(String name, String type, Date startDate, Date endDate) { + return convertObjectListToStringList(saleSessionRepository.getTypeCount(type, name, startDate, endDate)); + } + + private List<String[]> convertObjectListToStringList(List<Object[]> objectList) { + if (objectList == null) { + return new ArrayList<>(); + } + + List<String[]> stringList = new ArrayList<>(); + + for (Object[] objectArray : objectList) { + if (objectArray != null && objectArray.length == 2) { + String[] stringArray = new String[2]; + + stringArray[0] = objectArray[0] != null ? String.valueOf(objectArray[0]) : ""; + stringArray[1] = objectArray[1] != null ? String.valueOf(objectArray[1]) : ""; + + stringList.add(stringArray); + } + } + + return stringList; + } + }