Closed solgito closed 3 weeks ago
챌린지 메인
참여 기록
챌린지 별 참여 기록
성공/실패
챌린지 API
ChallengeParticipationRecord
Challenge
// ChallengeApi.java @GetMapping("/challenges/{id}/records") public SuccessResponse<ChallengeRecordsResponse> getChallengeRecords(@PathVariable("id") Long id, @AuthenticationPrincipal CustomUserDetails user) { return challengeRecordsService.getChallengeRecords(id, user.getMember()); }
// challenge/dto/ChallengeRecordsResponse.java public class ChallengeRecordsResponse { List<LocalDate> successDayList; List<LocalDate> failDayList; List<LocalDate> upcomingDayList; }
날짜
LocalDate
리스트
참여 성공 날짜 목록
참여 실패 날짜 목록
참여 예정인 날짜 목록
ChallengeRecordsService
// ChallengeRecordsService.java public SuccessResponse<ChallengeRecordsResponse> getChallengeRecords(Long challengeId, Member member) { Challenge challenge = challengeSearchService.getChallengeById(challengeId); ChallengeEnrollment enrollment = challengeEnrollmentSearchService.getByMemberAndChallenge(member, challenge); List<LocalDate> successDayList = new ArrayList<>(); List<LocalDate> failDayList = new ArrayList<>(); List<LocalDate> upcomingDayList = new ArrayList<>(); List<ChallengeParticipationRecord> recordList = challengeParticipationRecordSearchService.findAllByChallengeEnrollment(enrollment); LocalDate today = TimeZoneConverter.convertEtcToLocalTimeZone(ZonedDateTime.now()).toLocalDate(); // 핵심 로직 recordList .forEach(record -> { LocalDate targetDate = TimeZoneConverter.convertEtcToLocalTimeZone(record.getTargetDate()).toLocalDate(); if (targetDate.isBefore(today)) { List<LocalDate> targetList = record.existsChallengePost() ? successDayList : failDayList; targetList.add(targetDate); } else if (targetDate.isEqual(today)) { List<LocalDate> targetList = record.existsChallengePost() ? successDayList : upcomingDayList; targetList.add(targetDate); } else { upcomingDayList.add(targetDate); } }); return SuccessResponse.of( SuccessCode.NO_MESSAGE, ChallengeRecordsResponse.builder() .successDayList(successDayList) .failDayList(failDayList) .upcomingDayList(upcomingDayList) .build() ); }
챌린지
멤버
모든 record 기록
API 요청일
record
참여일
targetDate
요청일
성공
실패
성공 목록
예정 목록
repository
서비스
find 및 get 네이밍 전략
개요
챌린지 메인
) 페이지에는,참여 기록
이 담긴 달력을 불러오는 버튼이 있습니다.챌린지 별 참여 기록
을 확인할 수 있는 달력에성공/실패
여부를 표시할 수 있도록 데이터를 조회하는 API를 제작했습니다.코드 주요 내용
챌린지 API
에 참여 기록 데이터를 불러오는 컨트롤러 메서드를 생성했습니다.ChallengeParticipationRecord
기반이지만,Challenge
별로 조회하는 url이 적합하다고 생각하여챌린지 API
에 만들게 되었습니다.성공/실패
참여 기록
을 담기 위한 DTO를 추가했습니다.날짜
데이터가 필요하기 때문에,LocalDate
리스트
로 구성했습니다.참여 성공 날짜 목록
,참여 실패 날짜 목록
,참여 예정인 날짜 목록
으로 이루어져 있습니다.ChallengeRecordsService
서비스 클래스 및 메서드를 생성했습니다.챌린지
조회를 요청한멤버
의모든 record 기록
을 확인합니다.API 요청일
기준,record
의참여일
인targetDate
가 요청일 이전인지 이후인지, 혹은 동일한지에 따라 분기가 나뉩니다.요청일
이전이라면, 연동 포스트의 존재 여부에 따라성공
과실패
를 구분해 리스트에 담습니다.요청일
과 동일하다면, 이미 포스트를 등록했을 경우성공 목록
에, 아직 하지 않았을 경우예정 목록
에 담습니다.요청일
이후라면, 모두예정 목록
에 들어갑니다.repository
에서 데이터를 조회하는서비스
메서드 중 해빗페이의find 및 get 네이밍 전략
을 따르지 못한 코드가 있어 수정했습니다.