From 76e06abcba86fb03937a6ed8c59b338181ec988b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B8=EC=A4=80?= <74056843+sejoon00@users.noreply.github.com> Date: Mon, 24 Mar 2025 02:09:03 +0900 Subject: [PATCH] =?UTF-8?q?[feat/#100]=20=EC=9D=B4=EB=B2=88=EC=A3=BC=20?= =?UTF-8?q?=EC=A7=84=EC=B2=99=EB=8F=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/response/HomeFeedResponse.java | 7 +-- .../service/HomeFeedFacadeService.java | 32 +++++++++--- .../client/submit/domain/ProgressStatus.java | 7 +++ .../service/ProblemSubmitGetService.java | 50 +++++++++++++++++++ 4 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/moplus/moplus_server/client/submit/domain/ProgressStatus.java create mode 100644 src/main/java/com/moplus/moplus_server/client/submit/service/ProblemSubmitGetService.java 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