diff --git a/src/main/java/sopt/org/hmh/domain/challenge/domain/Challenge.java b/src/main/java/sopt/org/hmh/domain/challenge/domain/Challenge.java index 53ce7817..0cadad54 100644 --- a/src/main/java/sopt/org/hmh/domain/challenge/domain/Challenge.java +++ b/src/main/java/sopt/org/hmh/domain/challenge/domain/Challenge.java @@ -39,6 +39,7 @@ public class Challenge extends BaseTimeEntity { private List apps; @OneToMany(mappedBy = "challenge", cascade = CascadeType.REMOVE, orphanRemoval = true) + @OrderBy("challengeDate ASC") private List historyDailyChallenges; @Builder diff --git a/src/main/java/sopt/org/hmh/domain/challenge/dto/response/ChallengeResponse.java b/src/main/java/sopt/org/hmh/domain/challenge/dto/response/ChallengeResponse.java index cebed4f1..8533e952 100644 --- a/src/main/java/sopt/org/hmh/domain/challenge/dto/response/ChallengeResponse.java +++ b/src/main/java/sopt/org/hmh/domain/challenge/dto/response/ChallengeResponse.java @@ -9,6 +9,7 @@ import sopt.org.hmh.domain.dailychallenge.domain.DailyChallenge; import sopt.org.hmh.domain.dailychallenge.domain.Status; +import java.util.Comparator; import java.util.List; @Builder diff --git a/src/main/java/sopt/org/hmh/domain/dailychallenge/controller/DailyChallengeApi.java b/src/main/java/sopt/org/hmh/domain/dailychallenge/controller/DailyChallengeApi.java index 486d1562..fd8158d5 100644 --- a/src/main/java/sopt/org/hmh/domain/dailychallenge/controller/DailyChallengeApi.java +++ b/src/main/java/sopt/org/hmh/domain/dailychallenge/controller/DailyChallengeApi.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestHeader; import sopt.org.hmh.domain.dailychallenge.dto.request.FinishedDailyChallengeListRequest; import sopt.org.hmh.domain.dailychallenge.dto.request.FinishedDailyChallengeStatusListRequest; +import sopt.org.hmh.domain.dailychallenge.dto.response.ChallengeStatusesResponse; import sopt.org.hmh.global.auth.jwt.JwtConstants; import sopt.org.hmh.global.common.constant.CustomHeaderType; import sopt.org.hmh.global.common.response.BaseResponse; @@ -34,7 +35,7 @@ public interface DailyChallengeApi { responseCode = "500", description = "서버 내부 오류입니다.", content = @Content)}) - ResponseEntity> orderAddHistoryDailyChallenge( + ResponseEntity> orderAddHistoryDailyChallenge( @Parameter(hidden = true) final Long userId, @RequestHeader(CustomHeaderType.TIME_ZONE) final String os, @RequestHeader(CustomHeaderType.TIME_ZONE) final String timeZone, @@ -55,7 +56,7 @@ ResponseEntity> orderAddHistoryDailyChallenge( responseCode = "500", description = "서버 내부 오류입니다.", content = @Content)}) - ResponseEntity> orderChangeStatusDailyChallenge( + ResponseEntity> orderChangeStatusDailyChallenge( @Parameter(hidden = true) final Long userId, @RequestHeader(CustomHeaderType.TIME_ZONE) final String timeZone, @RequestBody final FinishedDailyChallengeStatusListRequest request diff --git a/src/main/java/sopt/org/hmh/domain/dailychallenge/controller/DailyChallengeController.java b/src/main/java/sopt/org/hmh/domain/dailychallenge/controller/DailyChallengeController.java index 06e6a6fc..f8d900ea 100644 --- a/src/main/java/sopt/org/hmh/domain/dailychallenge/controller/DailyChallengeController.java +++ b/src/main/java/sopt/org/hmh/domain/dailychallenge/controller/DailyChallengeController.java @@ -4,9 +4,12 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import sopt.org.hmh.domain.challenge.dto.response.ChallengeResponse; +import sopt.org.hmh.domain.challenge.service.ChallengeFacade; import sopt.org.hmh.domain.dailychallenge.domain.exception.DailyChallengeSuccess; import sopt.org.hmh.domain.dailychallenge.dto.request.FinishedDailyChallengeListRequest; import sopt.org.hmh.domain.dailychallenge.dto.request.FinishedDailyChallengeStatusListRequest; +import sopt.org.hmh.domain.dailychallenge.dto.response.ChallengeStatusesResponse; import sopt.org.hmh.domain.dailychallenge.service.DailyChallengeFacade; import sopt.org.hmh.global.auth.UserId; import sopt.org.hmh.global.common.constant.CustomHeaderType; @@ -22,28 +25,28 @@ public class DailyChallengeController implements DailyChallengeApi { @Override @PostMapping("/finish") - public ResponseEntity> orderAddHistoryDailyChallenge( + public ResponseEntity> orderAddHistoryDailyChallenge( @UserId final Long userId, @RequestHeader(CustomHeaderType.OS) final String os, @RequestHeader(CustomHeaderType.TIME_ZONE) final String timeZone, @RequestBody @Valid final FinishedDailyChallengeListRequest request ) { - dailyChallengeFacade.addFinishedDailyChallengeHistory(userId, request, os); return ResponseEntity .status(DailyChallengeSuccess.SEND_FINISHED_DAILY_CHALLENGE_SUCCESS.getHttpStatus()) - .body(BaseResponse.success(DailyChallengeSuccess.SEND_FINISHED_DAILY_CHALLENGE_SUCCESS, new EmptyJsonResponse())); + .body(BaseResponse.success(DailyChallengeSuccess.SEND_FINISHED_DAILY_CHALLENGE_SUCCESS, + new ChallengeStatusesResponse(dailyChallengeFacade.addFinishedDailyChallengeHistory(userId, request, os)))); } @Override @PostMapping("/success") - public ResponseEntity> orderChangeStatusDailyChallenge( + public ResponseEntity> orderChangeStatusDailyChallenge( @UserId final Long userId, @RequestHeader(CustomHeaderType.TIME_ZONE) final String timeZone, @RequestBody final FinishedDailyChallengeStatusListRequest request ) { - dailyChallengeFacade.changeDailyChallengeStatusByIsSuccess(userId, request); return ResponseEntity .status(DailyChallengeSuccess.SEND_FINISHED_DAILY_CHALLENGE_SUCCESS.getHttpStatus()) - .body(BaseResponse.success(DailyChallengeSuccess.SEND_FINISHED_DAILY_CHALLENGE_SUCCESS, new EmptyJsonResponse())); + .body(BaseResponse.success(DailyChallengeSuccess.SEND_FINISHED_DAILY_CHALLENGE_SUCCESS, + new ChallengeStatusesResponse(dailyChallengeFacade.changeDailyChallengeStatusByIsSuccess(userId, request)))); } } \ No newline at end of file diff --git a/src/main/java/sopt/org/hmh/domain/dailychallenge/dto/response/ChallengeStatusesResponse.java b/src/main/java/sopt/org/hmh/domain/dailychallenge/dto/response/ChallengeStatusesResponse.java new file mode 100644 index 00000000..370a187b --- /dev/null +++ b/src/main/java/sopt/org/hmh/domain/dailychallenge/dto/response/ChallengeStatusesResponse.java @@ -0,0 +1,10 @@ +package sopt.org.hmh.domain.dailychallenge.dto.response; + +import sopt.org.hmh.domain.dailychallenge.domain.Status; + +import java.util.List; + +public record ChallengeStatusesResponse( + List statuses +) { +} diff --git a/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeJpaRepository.java b/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeJpaRepository.java index 56f1ce01..fc59e683 100644 --- a/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeJpaRepository.java +++ b/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeJpaRepository.java @@ -10,5 +10,5 @@ public interface DailyChallengeJpaRepository extends JpaRepository findByChallengeDateAndUserId(LocalDate challengeDate, Long userId); - List findAllByChallengeIdOrderByChallengeDate(Long challengeId); + List findAllByChallengeId(Long challengeId); } diff --git a/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeRepository.java b/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeRepository.java index 50093ab3..26d91fce 100644 --- a/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeRepository.java +++ b/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeRepository.java @@ -11,7 +11,7 @@ public interface DailyChallengeRepository { Optional findByChallengeDateAndUserId(LocalDate challengeDate, Long userId); - List findAllByChallengeIdOrderByChallengeDate(Long challengeId); + List findAllByChallengeId(Long challengeId); boolean existsByUserIdAndChallengeDateIn(Long userId, List localDates); } \ No newline at end of file diff --git a/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeRepositoryImpl.java b/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeRepositoryImpl.java index 23a4c556..64b5ccd6 100644 --- a/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeRepositoryImpl.java +++ b/src/main/java/sopt/org/hmh/domain/dailychallenge/repository/DailyChallengeRepositoryImpl.java @@ -27,8 +27,8 @@ public Optional findByChallengeDateAndUserId(LocalDate challenge } @Override - public List findAllByChallengeIdOrderByChallengeDate(Long challengeId) { - return dailyChallengeJpaRepository.findAllByChallengeIdOrderByChallengeDate(challengeId); + public List findAllByChallengeId(Long challengeId) { + return dailyChallengeJpaRepository.findAllByChallengeId(challengeId); } @Override diff --git a/src/main/java/sopt/org/hmh/domain/dailychallenge/service/DailyChallengeFacade.java b/src/main/java/sopt/org/hmh/domain/dailychallenge/service/DailyChallengeFacade.java index f6f3bbbf..ae44fee0 100644 --- a/src/main/java/sopt/org/hmh/domain/dailychallenge/service/DailyChallengeFacade.java +++ b/src/main/java/sopt/org/hmh/domain/dailychallenge/service/DailyChallengeFacade.java @@ -4,8 +4,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import sopt.org.hmh.domain.app.domain.ChallengeApp; import sopt.org.hmh.domain.app.service.HistoryAppService; +import sopt.org.hmh.domain.challenge.domain.Challenge; import sopt.org.hmh.domain.challenge.service.ChallengeService; import sopt.org.hmh.domain.dailychallenge.domain.DailyChallenge; import sopt.org.hmh.domain.dailychallenge.domain.Status; @@ -23,28 +23,27 @@ public class DailyChallengeFacade { private final UserService userService; @Transactional - public void addFinishedDailyChallengeHistory(Long userId, FinishedDailyChallengeListRequest requests, String os) { - Long currentChallengeId = userService.getCurrentChallengeIdByUserId(userId); - List currentChallengeApps = - challengeService.getCurrentChallengeAppByChallengeId(currentChallengeId); - - requests.finishedDailyChallenges().forEach(request -> { - DailyChallenge dailyChallenge = - dailyChallengeService.findDailyChallengeByChallengeIdAndChallengePeriodIndex( - currentChallengeId, request.challengePeriodIndex()); + public List addFinishedDailyChallengeHistory(Long userId, FinishedDailyChallengeListRequest request, String os) { + Challenge challenge = challengeService.findByIdOrElseThrow(userService.getCurrentChallengeIdByUserId(userId)); + + request.finishedDailyChallenges().forEach(challengeRequest -> { + DailyChallenge dailyChallenge = dailyChallengeService + .findDailyChallengeByChallengePeriodIndex(challenge, challengeRequest.challengePeriodIndex()); dailyChallengeService.changeStatusByCurrentStatus(dailyChallenge); - historyAppService.addHistoryApp(currentChallengeApps, request.apps(), dailyChallenge, os); + historyAppService.addHistoryApp(challenge.getApps(), challengeRequest.apps(), dailyChallenge, os); }); + + return getHistoryDailyChallenges(challenge); } @Transactional - public void changeDailyChallengeStatusByIsSuccess(Long userId, FinishedDailyChallengeStatusListRequest requests) { - Long currentChallengeId = userService.getCurrentChallengeIdByUserId(userId); - requests.finishedDailyChallenges().forEach(request -> { - DailyChallenge dailyChallenge = - dailyChallengeService.findDailyChallengeByChallengeIdAndChallengePeriodIndex( - currentChallengeId, request.challengePeriodIndex()); - if (request.isSuccess()) { + public List changeDailyChallengeStatusByIsSuccess(Long userId, FinishedDailyChallengeStatusListRequest request) { + Challenge challenge = challengeService.findByIdOrElseThrow(userService.getCurrentChallengeIdByUserId(userId)); + + request.finishedDailyChallenges().forEach(challengeRequest -> { + DailyChallenge dailyChallenge = dailyChallengeService + .findDailyChallengeByChallengePeriodIndex(challenge, challengeRequest.challengePeriodIndex()); + if (challengeRequest.isSuccess()) { dailyChallengeService.validateDailyChallengeStatus(dailyChallenge.getStatus(), List.of(Status.NONE)); dailyChallenge.changeStatus(Status.UNEARNED); } else { @@ -53,5 +52,14 @@ public void changeDailyChallengeStatusByIsSuccess(Long userId, FinishedDailyChal dailyChallenge.changeStatus(Status.FAILURE); } }); + + return getHistoryDailyChallenges(challenge); + } + + private List getHistoryDailyChallenges(Challenge challenge) { + return challenge.getHistoryDailyChallenges() + .stream() + .map(DailyChallenge::getStatus) + .toList(); } } diff --git a/src/main/java/sopt/org/hmh/domain/dailychallenge/service/DailyChallengeService.java b/src/main/java/sopt/org/hmh/domain/dailychallenge/service/DailyChallengeService.java index f84ec706..8186daae 100644 --- a/src/main/java/sopt/org/hmh/domain/dailychallenge/service/DailyChallengeService.java +++ b/src/main/java/sopt/org/hmh/domain/dailychallenge/service/DailyChallengeService.java @@ -24,9 +24,9 @@ public DailyChallenge findDailyChallengeByChallengeDateAndUserIdOrElseThrow(Loca .orElseThrow(() -> new DailyChallengeException(DailyChallengeError.DAILY_CHALLENGE_NOT_FOUND)); } - public DailyChallenge findDailyChallengeByChallengeIdAndChallengePeriodIndex(Long challengeId, Integer challengePeriodIndex) { + public DailyChallenge findDailyChallengeByChallengePeriodIndex(Challenge challenge, Integer challengePeriodIndex) { return Optional.ofNullable( - dailyChallengeRepository.findAllByChallengeIdOrderByChallengeDate(challengeId).get(challengePeriodIndex) + challenge.getHistoryDailyChallenges().get(challengePeriodIndex) ).orElseThrow(() -> new DailyChallengeException(DailyChallengeError.DAILY_CHALLENGE_PERIOD_INDEX_NOT_FOUND)); } @@ -85,12 +85,12 @@ private List createDailyChallengeByChallengePeriod(Challenge cha .toList(); } - public List getDailyChallengesByChallengeIdOrderByChallengeDate(Long challengeId) { - return dailyChallengeRepository.findAllByChallengeIdOrderByChallengeDate(challengeId); + public List getDailyChallengesByChallengeId(Long challengeId) { + return dailyChallengeRepository.findAllByChallengeId(challengeId); } public void changeInfoOfDailyChallenges(Long challengeId, List statuses, LocalDate challengeDate) { - List dailyChallenges = this.getDailyChallengesByChallengeIdOrderByChallengeDate(challengeId); + List dailyChallenges = this.getDailyChallengesByChallengeId(challengeId); changeStatusOfDailyChallenges(dailyChallenges, statuses); changeChallengeDateOfDailyChallenges(dailyChallenges, challengeDate); }