From d6c1b097293435305f78ef506b626acfc64930b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=EC=A0=95=ED=9B=84?= Date: Wed, 31 Jul 2024 19:36:32 +0900 Subject: [PATCH] feat: visitlist api --- .../market/application/MarketInfoUseCase.java | 103 ++++++++++++++++-- .../market/presentation/MarketController.java | 32 +++++- .../security/filter/CustomLoginFilter.java | 6 - 3 files changed, 118 insertions(+), 23 deletions(-) diff --git a/api-module/src/main/java/com/likelion/apimodule/market/application/MarketInfoUseCase.java b/api-module/src/main/java/com/likelion/apimodule/market/application/MarketInfoUseCase.java index c47a6a0..fa70d85 100644 --- a/api-module/src/main/java/com/likelion/apimodule/market/application/MarketInfoUseCase.java +++ b/api-module/src/main/java/com/likelion/apimodule/market/application/MarketInfoUseCase.java @@ -4,6 +4,7 @@ import com.likelion.apimodule.market.dto.VisitListInfo; import com.likelion.apimodule.security.util.JwtUtil; import com.likelion.coremodule.VisitList.domain.VisitList; +import com.likelion.coremodule.VisitList.domain.VisitStatus; import com.likelion.coremodule.VisitList.exception.VisitErrorCode; import com.likelion.coremodule.VisitList.exception.VisitException; import com.likelion.coremodule.VisitList.service.VisitListQueryService; @@ -16,10 +17,14 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -52,27 +57,101 @@ public void saveVisitList(Long storeId, String accessToken) { marketQueryService.saveVisitList(storeId, email); } - public List findVisitList(String accessToken) { + public Map> findVisitList(String accessToken) { String email = jwtUtil.getEmail(accessToken); User user = userQueryService.findByEmail(email); - List visitListInfos = new ArrayList<>(); List visitLists = visitListQueryService.findVisitListsByUserId(user.getUserId()); - for (VisitList i : visitLists) { - Long id = i.getId(); - Store store = storeQueryService.findStoreById(i.getStore().getId()); + Map> groupedByDate = visitLists.stream() + .collect(Collectors.groupingBy(vl -> vl.getCreatedAt().toLocalDate())); - LocalDateTime time = LocalDateTime.now(); - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); - String formattedTime = time.format(formatter); + Map> visitListInfosByDate = new LinkedHashMap<>(); - VisitListInfo visitListInfo = new VisitListInfo(id, store.getId(), store.getName(), store.getImageUrl(), formattedTime, i.getVisit_status()); - visitListInfos.add(visitListInfo); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); + + for (Map.Entry> entry : groupedByDate.entrySet()) { + LocalDate date = entry.getKey(); + List visitListsForDate = entry.getValue(); + + List sortedVisitListsForDate = visitListsForDate.stream() + .sorted(Comparator.comparing(VisitList::getCreatedAt)) + .toList(); + + List visitListInfos = sortedVisitListsForDate.stream() + .map(visitList -> { + Long id = visitList.getId(); + Store store = storeQueryService.findStoreById(visitList.getStore().getId()); + + LocalDateTime time = visitList.getCreatedAt(); + String formattedTime = time.format(formatter); + + return new VisitListInfo( + id, + store.getId(), + store.getName(), + store.getImageUrl(), + formattedTime, + visitList.getVisit_status() + ); + }) + .collect(Collectors.toList()); + + visitListInfosByDate.put(date, visitListInfos); + } + + return visitListInfosByDate; + } + + public Map> findTodayVisitList (String accessToken) { + String email = jwtUtil.getEmail(accessToken); + User user = userQueryService.findByEmail(email); + + List visitLists = visitListQueryService.findVisitListsByUserId(user.getUserId()); + + // 그룹화된 방문 리스트를 날짜별로 나누기 + Map> groupedByDate = visitLists.stream() + .collect(Collectors.groupingBy(vl -> vl.getCreatedAt().toLocalDate())); + + // 날짜별 VisitListInfo 리스트를 저장할 Map + Map> visitListInfosByDate = new LinkedHashMap<>(); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); + + for (Map.Entry> entry : groupedByDate.entrySet()) { + LocalDate date = entry.getKey(); + List visitListsForDate = entry.getValue(); + + // LocalDateTime을 기준으로 정렬 + List sortedVisitListsForDate = visitListsForDate.stream() + .sorted(Comparator.comparing(VisitList::getCreatedAt)) + .toList(); + + // 날짜별 VisitListInfo 리스트 생성 + List visitListInfos = sortedVisitListsForDate.stream() + .map(visitList -> { + Long id = visitList.getId(); + Store store = storeQueryService.findStoreById(visitList.getStore().getId()); + + LocalDateTime time = visitList.getCreatedAt(); + String formattedTime = time.format(formatter); + + return new VisitListInfo( + id, + store.getId(), + store.getName(), + store.getImageUrl(), + formattedTime, + visitList.getVisit_status() + ); + }) + .collect(Collectors.toList()); + + visitListInfosByDate.put(date, visitListInfos); } - return visitListInfos; + return visitListInfosByDate; } public void deleteVisitList(Long visitListId) { diff --git a/api-module/src/main/java/com/likelion/apimodule/market/presentation/MarketController.java b/api-module/src/main/java/com/likelion/apimodule/market/presentation/MarketController.java index 632a399..85cfa64 100644 --- a/api-module/src/main/java/com/likelion/apimodule/market/presentation/MarketController.java +++ b/api-module/src/main/java/com/likelion/apimodule/market/presentation/MarketController.java @@ -16,7 +16,9 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; import java.util.List; +import java.util.Map; @RequiredArgsConstructor @RestController @@ -91,16 +93,36 @@ public ApplicationResponse saveVisitList(@PathVariable Long storeId, value = { @ApiResponse( responseCode = "200", - description = "방문 리스트 조회 성공", + description = "전체 방문 리스트 조회 성공", useReturnTypeSchema = true ) } ) - @Operation(summary = "방문 리스트 조회 API", description = "방문 리스트 조회 API 입니다.") - public ApplicationResponse> findVisitList(@RequestHeader(AuthConsts.ACCESS_TOKEN_HEADER) String accessToken) { + @Operation(summary = "전체 방문 리스트 조회 API", description = "전체 방문 리스트 조회 API 입니다.") + public ApplicationResponse>> findVisitList( + @RequestHeader(AuthConsts.ACCESS_TOKEN_HEADER) String accessToken) { - final List visitList = marketInfoUseCase.findVisitList(accessToken); - return ApplicationResponse.ok(visitList); + Map> visitListByDate = marketInfoUseCase.findVisitList(accessToken); + return ApplicationResponse.ok(visitListByDate); + } + + // 당일 방문 리스트 조회 ( 자정에 삭제 / 방문 완료 시 삭제 ) + @GetMapping("/visitlist/today") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "당일 방문 리스트 조회 성공", + useReturnTypeSchema = true + ) + } + ) + @Operation(summary = "당일 방문 리스트 조회 API", description = "당일 방문 리스트 조회 API 입니다.") + public ApplicationResponse>> getTodayVisitList( + @RequestHeader(AuthConsts.ACCESS_TOKEN_HEADER) String accessToken) { + + Map> visitListInfos = marketInfoUseCase.findTodayVisitList(accessToken); + return ApplicationResponse.ok(visitListInfos); } // 방문 리스트 - 준비 완료로 변경 diff --git a/api-module/src/main/java/com/likelion/apimodule/security/filter/CustomLoginFilter.java b/api-module/src/main/java/com/likelion/apimodule/security/filter/CustomLoginFilter.java index 8d29fcc..5311ed7 100644 --- a/api-module/src/main/java/com/likelion/apimodule/security/filter/CustomLoginFilter.java +++ b/api-module/src/main/java/com/likelion/apimodule/security/filter/CustomLoginFilter.java @@ -1,19 +1,13 @@ package com.likelion.apimodule.security.filter; import com.fasterxml.jackson.databind.ObjectMapper; -import com.likelion.apimodule.security.user.CustomUserDetails; import com.likelion.apimodule.security.util.JwtUtil; import com.likelion.apimodule.user.dto.KakaoLoginRequest; -import com.likelion.commonmodule.exception.common.ApiResponse; -import com.likelion.commonmodule.exception.jwt.dto.JwtPair; import com.likelion.commonmodule.redis.util.RedisUtil; -import com.likelion.commonmodule.security.util.HttpResponseUtil; -import jakarta.servlet.FilterChain; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.NonNull; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;