Skip to content

Commit

Permalink
feat: visitlist api
Browse files Browse the repository at this point in the history
  • Loading branch information
Jeongh00 committed Jul 31, 2024
1 parent 1f14819 commit d6c1b09
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 23 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -52,27 +57,101 @@ public void saveVisitList(Long storeId, String accessToken) {
marketQueryService.saveVisitList(storeId, email);
}

public List<VisitListInfo> findVisitList(String accessToken) {
public Map<LocalDate, List<VisitListInfo>> findVisitList(String accessToken) {

String email = jwtUtil.getEmail(accessToken);
User user = userQueryService.findByEmail(email);

List<VisitListInfo> visitListInfos = new ArrayList<>();
List<VisitList> visitLists = visitListQueryService.findVisitListsByUserId(user.getUserId());

for (VisitList i : visitLists) {
Long id = i.getId();
Store store = storeQueryService.findStoreById(i.getStore().getId());
Map<LocalDate, List<VisitList>> 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<LocalDate, List<VisitListInfo>> 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<LocalDate, List<VisitList>> entry : groupedByDate.entrySet()) {
LocalDate date = entry.getKey();
List<VisitList> visitListsForDate = entry.getValue();

List<VisitList> sortedVisitListsForDate = visitListsForDate.stream()
.sorted(Comparator.comparing(VisitList::getCreatedAt))
.toList();

List<VisitListInfo> 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<LocalDate, List<VisitListInfo>> findTodayVisitList (String accessToken) {
String email = jwtUtil.getEmail(accessToken);
User user = userQueryService.findByEmail(email);

List<VisitList> visitLists = visitListQueryService.findVisitListsByUserId(user.getUserId());

// 그룹화된 방문 리스트를 날짜별로 나누기
Map<LocalDate, List<VisitList>> groupedByDate = visitLists.stream()
.collect(Collectors.groupingBy(vl -> vl.getCreatedAt().toLocalDate()));

// 날짜별 VisitListInfo 리스트를 저장할 Map
Map<LocalDate, List<VisitListInfo>> visitListInfosByDate = new LinkedHashMap<>();

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");

for (Map.Entry<LocalDate, List<VisitList>> entry : groupedByDate.entrySet()) {
LocalDate date = entry.getKey();
List<VisitList> visitListsForDate = entry.getValue();

// LocalDateTime을 기준으로 정렬
List<VisitList> sortedVisitListsForDate = visitListsForDate.stream()
.sorted(Comparator.comparing(VisitList::getCreatedAt))
.toList();

// 날짜별 VisitListInfo 리스트 생성
List<VisitListInfo> 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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -91,16 +93,36 @@ public ApplicationResponse<String> saveVisitList(@PathVariable Long storeId,
value = {
@ApiResponse(
responseCode = "200",
description = "방문 리스트 조회 성공",
description = "전체 방문 리스트 조회 성공",
useReturnTypeSchema = true
)
}
)
@Operation(summary = "방문 리스트 조회 API", description = "방문 리스트 조회 API 입니다.")
public ApplicationResponse<List<VisitListInfo>> findVisitList(@RequestHeader(AuthConsts.ACCESS_TOKEN_HEADER) String accessToken) {
@Operation(summary = "전체 방문 리스트 조회 API", description = "전체 방문 리스트 조회 API 입니다.")
public ApplicationResponse<Map<LocalDate, List<VisitListInfo>>> findVisitList(
@RequestHeader(AuthConsts.ACCESS_TOKEN_HEADER) String accessToken) {

final List<VisitListInfo> visitList = marketInfoUseCase.findVisitList(accessToken);
return ApplicationResponse.ok(visitList);
Map<LocalDate, List<VisitListInfo>> 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<Map<LocalDate, List<VisitListInfo>>> getTodayVisitList(
@RequestHeader(AuthConsts.ACCESS_TOKEN_HEADER) String accessToken) {

Map<LocalDate, List<VisitListInfo>> visitListInfos = marketInfoUseCase.findTodayVisitList(accessToken);
return ApplicationResponse.ok(visitListInfos);
}

// 방문 리스트 - 준비 완료로 변경
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down

0 comments on commit d6c1b09

Please sign in to comment.