diff --git a/src/main/java/com/moplus/moplus_server/client/homefeed/dto/response/HomeFeedResponse.java b/src/main/java/com/moplus/moplus_server/client/homefeed/dto/response/HomeFeedResponse.java index 8ad4c077..2bda92a4 100644 --- a/src/main/java/com/moplus/moplus_server/client/homefeed/dto/response/HomeFeedResponse.java +++ b/src/main/java/com/moplus/moplus_server/client/homefeed/dto/response/HomeFeedResponse.java @@ -2,6 +2,7 @@ import com.moplus.moplus_server.admin.problemset.dto.response.ProblemSetGetResponse; import com.moplus.moplus_server.admin.problemset.dto.response.ProblemSummaryResponse; +import com.moplus.moplus_server.client.submit.domain.ProgressStatus; import java.time.LocalDate; import java.util.List; @@ -18,10 +19,10 @@ public static HomeFeedResponse of( public record DailyProgressResponse( LocalDate date, - double progressRate + ProgressStatus progressStatus ) { - public static DailyProgressResponse of(LocalDate date, double progressRate) { - return new DailyProgressResponse(date, progressRate); + public static DailyProgressResponse of(LocalDate date, ProgressStatus progressStatus) { + return new DailyProgressResponse(date, progressStatus); } } diff --git a/src/main/java/com/moplus/moplus_server/client/homefeed/service/HomeFeedFacadeService.java b/src/main/java/com/moplus/moplus_server/client/homefeed/service/HomeFeedFacadeService.java index 86af53cb..3f0760ad 100644 --- a/src/main/java/com/moplus/moplus_server/client/homefeed/service/HomeFeedFacadeService.java +++ b/src/main/java/com/moplus/moplus_server/client/homefeed/service/HomeFeedFacadeService.java @@ -6,6 +6,8 @@ import com.moplus.moplus_server.client.homefeed.dto.response.HomeFeedResponse; import com.moplus.moplus_server.client.homefeed.dto.response.HomeFeedResponse.DailyProgressResponse; import com.moplus.moplus_server.client.homefeed.dto.response.HomeFeedResponse.ProblemSetHomeFeedResponse; +import com.moplus.moplus_server.client.submit.domain.ProgressStatus; +import com.moplus.moplus_server.client.submit.service.ProblemSubmitGetService; import com.moplus.moplus_server.domain.problemset.service.ProblemSetGetService; import com.moplus.moplus_server.member.domain.Member; import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic; @@ -24,27 +26,41 @@ @RequiredArgsConstructor public class HomeFeedFacadeService { + private static final LocalDate today = LocalDate.now(); + private static final LocalDate monday = today.with(DayOfWeek.MONDAY); + private static final LocalDate friday = today.with(DayOfWeek.FRIDAY); private final ProblemSetStatisticRepository problemSetStatisticRepository; private final PublishGetService publishGetService; private final ProblemSetGetService problemSetGetService; + private final ProblemSubmitGetService problemSubmitGetService; @Transactional(readOnly = true) public HomeFeedResponse getHomeFeed(Member member) { Long memberId = member.getId(); - List dailyProgresses = new ArrayList<>(); // 다음 PR에서 구현 - List problemSets = getWeekdayProblemSets(); + List publishes = publishGetService.getPublishesBetweenDates(monday, friday); + + List dailyProgresses = getDailyProgresses(memberId, publishes); + List problemSets = getWeekdayProblemSets(publishes); return HomeFeedResponse.of(dailyProgresses, problemSets); } - private List getWeekdayProblemSets() { - LocalDate today = LocalDate.now(); - LocalDate monday = today.with(DayOfWeek.MONDAY); - LocalDate friday = today.with(DayOfWeek.FRIDAY); + private List getDailyProgresses(Long memberId, List publishes) { + Map progressStatuses = problemSubmitGetService.getProgressStatuses(memberId, + publishes); + + List responses = new ArrayList<>(); + for (LocalDate date = monday; !date.isAfter(friday); date = date.plusDays(1)) { + ProgressStatus status = progressStatuses.getOrDefault(date, ProgressStatus.NOT_STARTED); + responses.add(DailyProgressResponse.of(date, status)); + } + + return responses; + } + + private List getWeekdayProblemSets(List publishes) { - // 월요일부터 금요일까지의 발행된 문제 세트 조회 - List publishes = publishGetService.getPublishesBetweenDates(monday, friday); Map publishByDate = publishes.stream() .collect(Collectors.toMap(Publish::getPublishedDate, publish -> publish)); diff --git a/src/main/java/com/moplus/moplus_server/client/submit/domain/ProgressStatus.java b/src/main/java/com/moplus/moplus_server/client/submit/domain/ProgressStatus.java new file mode 100644 index 00000000..163ce374 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/domain/ProgressStatus.java @@ -0,0 +1,7 @@ +package com.moplus.moplus_server.client.submit.domain; + +public enum ProgressStatus { + COMPLETED, + IN_PROGRESS, + NOT_STARTED +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/client/submit/service/ProblemSubmitGetService.java b/src/main/java/com/moplus/moplus_server/client/submit/service/ProblemSubmitGetService.java new file mode 100644 index 00000000..9e3e404f --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/service/ProblemSubmitGetService.java @@ -0,0 +1,50 @@ +package com.moplus.moplus_server.client.submit.service; + +import com.moplus.moplus_server.admin.publish.domain.Publish; +import com.moplus.moplus_server.client.submit.domain.ProblemSubmit; +import com.moplus.moplus_server.client.submit.domain.ProgressStatus; +import com.moplus.moplus_server.client.submit.repository.ProblemSubmitRepository; +import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; +import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; +import java.time.LocalDate; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ProblemSubmitGetService { + + private final ProblemSubmitRepository problemSubmitRepository; + private final ProblemSetRepository problemSetRepository; + + @Transactional(readOnly = true) + public ProgressStatus getProgressStatus(Long memberId, Long publishId) { + List submits = problemSubmitRepository.findByMemberIdAndPublishId(memberId, publishId); + + if (submits.isEmpty()) { + return ProgressStatus.NOT_STARTED; + } + + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(submits.get(0).getProblemId()); + + int totalProblems = problemSet.getProblemIds().size(); + + if (submits.size() == totalProblems) { + return ProgressStatus.COMPLETED; + } + return ProgressStatus.IN_PROGRESS; + } + + @Transactional(readOnly = true) + public Map getProgressStatuses(Long memberId, List publishes) { + return publishes.stream() + .collect(Collectors.toMap( + Publish::getPublishedDate, + publish -> getProgressStatus(memberId, publish.getId()) + )); + } +} \ No newline at end of file