From 3ba3af2f3f1cc5b340c21f3f166c9a6c08be7282 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 01:09:08 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[feat/98]=20=EC=9D=B4=EB=B2=88=EC=A3=BC=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=EC=98=81=EC=97=AD=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/ChildProblemMapperImpl.java | 2 +- .../service/mapper/ProblemMapperImpl.java | 2 +- .../publish/service/PublishGetService.java | 19 ++++- .../controller/HomeFeedController.java | 27 +++++++ .../dto/response/HomeFeedResponse.java | 68 +++++++++++++++++ .../service/HomeFeedFacadeService.java | 75 +++++++++++++++++++ .../repository/ProblemSubmitRepository.java | 5 +- .../service/ProblemSetGetService.java | 13 +++- .../service/CountStatisticsGetService.java | 18 +++++ 9 files changed, 220 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/moplus/moplus_server/client/homefeed/controller/HomeFeedController.java create mode 100644 src/main/java/com/moplus/moplus_server/client/homefeed/dto/response/HomeFeedResponse.java create mode 100644 src/main/java/com/moplus/moplus_server/client/homefeed/service/HomeFeedFacadeService.java create mode 100644 src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsGetService.java diff --git a/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapperImpl.java b/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapperImpl.java index d528b5c5..7b1bd0c8 100644 --- a/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapperImpl.java +++ b/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapperImpl.java @@ -11,7 +11,7 @@ @Generated( value = "org.mapstruct.ap.MappingProcessor", - date = "2025-03-14T20:25:51+0900", + date = "2025-03-24T01:02:22+0900", comments = "version: 1.6.3, compiler: javac, environment: Java 17.0.10 (JetBrains s.r.o.)" ) @Component diff --git a/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapperImpl.java b/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapperImpl.java index b3e294c2..6992d6a4 100644 --- a/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapperImpl.java +++ b/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapperImpl.java @@ -15,7 +15,7 @@ @Generated( value = "org.mapstruct.ap.MappingProcessor", - date = "2025-03-15T21:23:23+0900", + date = "2025-03-24T01:02:22+0900", comments = "version: 1.6.3, compiler: javac, environment: Java 17.0.10 (JetBrains s.r.o.)" ) @Component diff --git a/src/main/java/com/moplus/moplus_server/admin/publish/service/PublishGetService.java b/src/main/java/com/moplus/moplus_server/admin/publish/service/PublishGetService.java index d15f2c20..b7facd2c 100644 --- a/src/main/java/com/moplus/moplus_server/admin/publish/service/PublishGetService.java +++ b/src/main/java/com/moplus/moplus_server/admin/publish/service/PublishGetService.java @@ -1,13 +1,14 @@ package com.moplus.moplus_server.admin.publish.service; -import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; -import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; import com.moplus.moplus_server.admin.publish.domain.Publish; import com.moplus.moplus_server.admin.publish.dto.response.PublishMonthGetResponse; import com.moplus.moplus_server.admin.publish.dto.response.PublishProblemSetResponse; +import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; +import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; import com.moplus.moplus_server.domain.publish.repository.PublishRepository; import com.moplus.moplus_server.global.error.exception.ErrorCode; import com.moplus.moplus_server.global.error.exception.InvalidValueException; +import java.time.DayOfWeek; import java.time.LocalDate; import java.util.List; import java.util.Map; @@ -42,6 +43,7 @@ public List getPublishMonth(int year, int month) { .collect(Collectors.toList()); } + private Map getProblemSetMap(List publishes) { List problemSetIds = publishes.stream() .map(Publish::getProblemSetId) @@ -62,4 +64,17 @@ private PublishMonthGetResponse convertToResponse(Publish publish, Map getCurrentWeekPublishes() { + LocalDate today = LocalDate.now(); + LocalDate startOfWeek = today.with(DayOfWeek.MONDAY); + LocalDate endOfWeek = today.with(DayOfWeek.FRIDAY); + + return getWeeklyPublishes(startOfWeek, endOfWeek); + } + + private List getWeeklyPublishes(LocalDate startDate, LocalDate endDate) { + return publishRepository.findByPublishedDateBetween(startDate, endDate); + } } diff --git a/src/main/java/com/moplus/moplus_server/client/homefeed/controller/HomeFeedController.java b/src/main/java/com/moplus/moplus_server/client/homefeed/controller/HomeFeedController.java new file mode 100644 index 00000000..2e1bc012 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/homefeed/controller/HomeFeedController.java @@ -0,0 +1,27 @@ +package com.moplus.moplus_server.client.homefeed.controller; + +import com.moplus.moplus_server.client.homefeed.dto.response.HomeFeedResponse; +import com.moplus.moplus_server.client.homefeed.service.HomeFeedFacadeService; +import com.moplus.moplus_server.global.annotation.AuthUser; +import com.moplus.moplus_server.member.domain.Member; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "홈 피드 조회", description = "홈 피드 관련 API") +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/client/home-feed") +public class HomeFeedController { + + private final HomeFeedFacadeService homeFeedFacadeService; + + @Operation(summary = "홈 피드 조회", description = "회원의 홈 피드 정보를 조회합니다.") + @GetMapping("") + public HomeFeedResponse getHomeFeed(@AuthUser Member member) { + return homeFeedFacadeService.getHomeFeed(member); + } +} 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 new file mode 100644 index 00000000..8ad4c077 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/homefeed/dto/response/HomeFeedResponse.java @@ -0,0 +1,68 @@ +package com.moplus.moplus_server.client.homefeed.dto.response; + +import com.moplus.moplus_server.admin.problemset.dto.response.ProblemSetGetResponse; +import com.moplus.moplus_server.admin.problemset.dto.response.ProblemSummaryResponse; +import java.time.LocalDate; +import java.util.List; + +public record HomeFeedResponse( + List dailyProgresses, + List problemSets +) { + public static HomeFeedResponse of( + List dailyProgresses, + List problemSets + ) { + return new HomeFeedResponse(dailyProgresses, problemSets); + } + + public record DailyProgressResponse( + LocalDate date, + double progressRate + ) { + public static DailyProgressResponse of(LocalDate date, double progressRate) { + return new DailyProgressResponse(date, progressRate); + } + } + + public record ProblemSetHomeFeedResponse( + LocalDate date, + Long problemSetId, + String title, + Long submitCount, + ProblemHomeFeedResponse problemHomeFeedResponse + ) { + public static ProblemSetHomeFeedResponse of(LocalDate date, ProblemSetGetResponse problemSetGetResponse, + Long submitCount) { + return new ProblemSetHomeFeedResponse( + date, + problemSetGetResponse.id(), + problemSetGetResponse.title(), + submitCount, + ProblemHomeFeedResponse.of(problemSetGetResponse.problemSummaries().get(0)) + ); + } + + public static ProblemSetHomeFeedResponse of(LocalDate date) { + return new ProblemSetHomeFeedResponse( + date, + null, + null, + null, + null + ); + } + } + + public record ProblemHomeFeedResponse( + Long problemId, + String mainProblemImageUrl + ) { + public static ProblemHomeFeedResponse of(ProblemSummaryResponse problemSummaryResponse) { + return new ProblemHomeFeedResponse( + problemSummaryResponse.problemId(), + problemSummaryResponse.mainProblemImageUrl() + ); + } + } +} \ No newline at end of file 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 new file mode 100644 index 00000000..3f8399d9 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/homefeed/service/HomeFeedFacadeService.java @@ -0,0 +1,75 @@ +package com.moplus.moplus_server.client.homefeed.service; + +import com.moplus.moplus_server.admin.problemset.dto.response.ProblemSetGetResponse; +import com.moplus.moplus_server.admin.publish.domain.Publish; +import com.moplus.moplus_server.admin.publish.service.PublishGetService; +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.domain.problemset.service.ProblemSetGetService; +import com.moplus.moplus_server.member.domain.Member; +import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic; +import com.moplus.moplus_server.statistic.Problem.repository.ProblemSetStatisticRepository; +import java.time.DayOfWeek; +import java.time.LocalDate; +import java.util.ArrayList; +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 HomeFeedFacadeService { + + private final ProblemSetStatisticRepository problemSetStatisticRepository; + private final PublishGetService publishGetService; + private final ProblemSetGetService problemSetGetService; + + @Transactional(readOnly = true) + public HomeFeedResponse getHomeFeed(Member member) { + Long memberId = member.getId(); + + List dailyProgresses = new ArrayList<>(); // 다음 PR에서 구현 + List problemSets = getWeekdayProblemSets(); + + return HomeFeedResponse.of(dailyProgresses, problemSets); + } + + private List getWeekdayProblemSets() { + LocalDate today = LocalDate.now(); + LocalDate monday = today.with(DayOfWeek.MONDAY); + LocalDate friday = today.with(DayOfWeek.FRIDAY); + + // 월요일부터 금요일까지의 발행된 문제 세트 조회 + List publishes = publishGetService.getCurrentWeekPublishes(); + Map publishByDate = publishes.stream() + .collect(Collectors.toMap(Publish::getPublishedDate, publish -> publish)); + + // 문제 세트 정보 조회 + List problemSetIds = publishes.stream() + .map(Publish::getProblemSetId) + .toList(); + Map problemSetMap = problemSetGetService.getProblemSets(problemSetIds).stream() + .collect(Collectors.toMap(ProblemSetGetResponse::id, response -> response)); + + // 월요일부터 금요일까지의 모든 날짜에 대한 응답 생성 + List responses = new ArrayList<>(); + for (LocalDate date = monday; !date.isAfter(friday); date = date.plusDays(1)) { + Publish publish = publishByDate.get(date); + if (publish != null) { + ProblemSetGetResponse problemSet = problemSetMap.get(publish.getProblemSetId()); + Long submitCount = problemSetStatisticRepository.findById(problemSet.id()) + .map(ProblemSetStatistic::getSubmitCount) + .orElse(0L); + responses.add(ProblemSetHomeFeedResponse.of(date, problemSet, submitCount)); + } else { + responses.add(ProblemSetHomeFeedResponse.of(date)); + } + } + + return responses; + } +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/client/submit/repository/ProblemSubmitRepository.java b/src/main/java/com/moplus/moplus_server/client/submit/repository/ProblemSubmitRepository.java index d9ff2554..a78f2f6f 100644 --- a/src/main/java/com/moplus/moplus_server/client/submit/repository/ProblemSubmitRepository.java +++ b/src/main/java/com/moplus/moplus_server/client/submit/repository/ProblemSubmitRepository.java @@ -12,8 +12,9 @@ public interface ProblemSubmitRepository extends JpaRepository findByMemberIdAndPublishIdAndProblemId(Long memberId, Long publishId, Long problemId); - default ProblemSubmit findByMemberIdAndPublishIdAndProblemIdElseThrow(Long memberId, Long publishId, Long problemId) { + default ProblemSubmit findByMemberIdAndPublishIdAndProblemIdElseThrow(Long memberId, Long publishId, + Long problemId) { return findByMemberIdAndPublishIdAndProblemId(memberId, publishId, problemId).orElseThrow( () -> new NotFoundException(ErrorCode.PROBLEM_SUBMIT_NOT_CONFIRMED)); } -} +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetGetService.java b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetGetService.java index ef66f469..8d7791b3 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetGetService.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetGetService.java @@ -1,14 +1,14 @@ package com.moplus.moplus_server.domain.problemset.service; +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.admin.publish.domain.Publish; import com.moplus.moplus_server.domain.concept.domain.ConceptTag; import com.moplus.moplus_server.domain.concept.repository.ConceptTagRepository; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; import com.moplus.moplus_server.domain.problem.repository.ProblemRepository; import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; -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.domain.problemset.repository.ProblemSetRepository; -import com.moplus.moplus_server.admin.publish.domain.Publish; import com.moplus.moplus_server.domain.publish.repository.PublishRepository; import com.moplus.moplus_server.global.error.exception.BusinessException; import com.moplus.moplus_server.global.error.exception.ErrorCode; @@ -55,4 +55,11 @@ public ProblemSetGetResponse getProblemSet(Long problemSetId) { } return ProblemSetGetResponse.of(problemSet, publishedDates, problemSummaries); } + + @Transactional(readOnly = true) + public List getProblemSets(List problemSetIds) { + return problemSetIds.stream() + .map(this::getProblemSet) + .toList(); + } } diff --git a/src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsGetService.java b/src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsGetService.java new file mode 100644 index 00000000..983a87d6 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsGetService.java @@ -0,0 +1,18 @@ +package com.moplus.moplus_server.statistic.Problem.service; + +import com.moplus.moplus_server.statistic.Problem.repository.ProblemSetStatisticRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class CountStatisticsGetService { + + private final ProblemSetStatisticRepository problemSetStatisticRepository; + + @Transactional(readOnly = true) + public Long getProblemSetCount(Long id) { + return problemSetStatisticRepository.findByIdElseThrow(id).getSubmitCount(); + } +} From c8549c7e2e55f771e0352c8aa3422297b9c114aa 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 01:13:22 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[feat/98]=20=EC=9D=B4=EB=B2=88=EC=A3=BC=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=EC=98=81=EC=97=AD=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/publish/service/PublishGetService.java | 11 +---------- .../homefeed/service/HomeFeedFacadeService.java | 2 +- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/moplus/moplus_server/admin/publish/service/PublishGetService.java b/src/main/java/com/moplus/moplus_server/admin/publish/service/PublishGetService.java index b7facd2c..d440d293 100644 --- a/src/main/java/com/moplus/moplus_server/admin/publish/service/PublishGetService.java +++ b/src/main/java/com/moplus/moplus_server/admin/publish/service/PublishGetService.java @@ -8,7 +8,6 @@ import com.moplus.moplus_server.domain.publish.repository.PublishRepository; import com.moplus.moplus_server.global.error.exception.ErrorCode; import com.moplus.moplus_server.global.error.exception.InvalidValueException; -import java.time.DayOfWeek; import java.time.LocalDate; import java.util.List; import java.util.Map; @@ -66,15 +65,7 @@ private PublishMonthGetResponse convertToResponse(Publish publish, Map getCurrentWeekPublishes() { - LocalDate today = LocalDate.now(); - LocalDate startOfWeek = today.with(DayOfWeek.MONDAY); - LocalDate endOfWeek = today.with(DayOfWeek.FRIDAY); - - return getWeeklyPublishes(startOfWeek, endOfWeek); - } - - private List getWeeklyPublishes(LocalDate startDate, LocalDate endDate) { + public List getPublishesBetweenDates(LocalDate startDate, LocalDate endDate) { return publishRepository.findByPublishedDateBetween(startDate, endDate); } } 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 3f8399d9..86af53cb 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 @@ -44,7 +44,7 @@ private List getWeekdayProblemSets() { LocalDate friday = today.with(DayOfWeek.FRIDAY); // 월요일부터 금요일까지의 발행된 문제 세트 조회 - List publishes = publishGetService.getCurrentWeekPublishes(); + List publishes = publishGetService.getPublishesBetweenDates(monday, friday); Map publishByDate = publishes.stream() .collect(Collectors.toMap(Publish::getPublishedDate, publish -> publish)); 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 3/5] =?UTF-8?q?[feat/#100]=20=EC=9D=B4=EB=B2=88=EC=A3=BC?= =?UTF-8?q?=20=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 From eafda906d14221e84d1db9d4fdc79aabde0d7b9e 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 03:07:35 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[feat/#102]=20=EB=B0=9C=ED=96=89=20?= =?UTF-8?q?=EC=86=8D=20=EB=AC=B8=ED=95=AD=20=EC=A1=B0=ED=9A=8C=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProblemGetController.java | 68 ++++++++++++++++ .../dto/response/AllProblemGetResponse.java | 3 +- .../ChildProblemClientGetResponse.java | 2 +- .../response/ProblemClientGetResponse.java | 5 +- .../response/PublishClientGetResponse.java | 26 ++++++ .../service/ProblemsGetService.java | 81 +++++++++++++++---- .../controller/ProblemGetController.java | 52 ------------ .../submit/domain/ProblemSubmitStatus.java | 5 +- 8 files changed, 169 insertions(+), 73 deletions(-) create mode 100644 src/main/java/com/moplus/moplus_server/client/problem/controller/ProblemGetController.java rename src/main/java/com/moplus/moplus_server/client/{submit => problem}/dto/response/AllProblemGetResponse.java (86%) rename src/main/java/com/moplus/moplus_server/client/{submit => problem}/dto/response/ChildProblemClientGetResponse.java (92%) rename src/main/java/com/moplus/moplus_server/client/{submit => problem}/dto/response/ProblemClientGetResponse.java (83%) create mode 100644 src/main/java/com/moplus/moplus_server/client/problem/dto/response/PublishClientGetResponse.java rename src/main/java/com/moplus/moplus_server/client/{submit => problem}/service/ProblemsGetService.java (66%) delete mode 100644 src/main/java/com/moplus/moplus_server/client/submit/controller/ProblemGetController.java diff --git a/src/main/java/com/moplus/moplus_server/client/problem/controller/ProblemGetController.java b/src/main/java/com/moplus/moplus_server/client/problem/controller/ProblemGetController.java new file mode 100644 index 00000000..6ce2e5bc --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/problem/controller/ProblemGetController.java @@ -0,0 +1,68 @@ +package com.moplus.moplus_server.client.problem.controller; + +import com.moplus.moplus_server.client.problem.dto.response.AllProblemGetResponse; +import com.moplus.moplus_server.client.problem.dto.response.ChildProblemClientGetResponse; +import com.moplus.moplus_server.client.problem.dto.response.ProblemClientGetResponse; +import com.moplus.moplus_server.client.problem.dto.response.PublishClientGetResponse; +import com.moplus.moplus_server.client.problem.service.ProblemsGetService; +import com.moplus.moplus_server.global.annotation.AuthUser; +import com.moplus.moplus_server.member.domain.Member; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "클라이언트 문제 조회", description = "클라이언트 문제 조회 관련 API") +@RestController +@RequestMapping("/api/v1/client") +@RequiredArgsConstructor +public class ProblemGetController { + + private final ProblemsGetService problemsGetService; + + @GetMapping("problem/all/{year}/{month}") + @Operation(summary = "전체 문제 조회", description = "월별 문제들에 대한 진행도와 정보들을 조회합니다.") + public ResponseEntity> getAllProblem( + @PathVariable("year") int year, + @PathVariable("month") int month, + @AuthUser Member member + ) { + return ResponseEntity.ok(problemsGetService.getAllProblem(member.getId(), year, month)); + } + + @GetMapping("problem/{publishId}") + @Operation(summary = "특정 발행 속 문항들 조회", description = "사용자에게 보여지는 특정 발행에 속한 문항을 조회합니다.") + public ResponseEntity getProblemsInPublish( + @PathVariable("publishId") Long publishId, + @AuthUser Member member + ) { + return ResponseEntity.ok(problemsGetService.getProblemsInPublish(member.getId(), publishId)); + } + + @GetMapping("problem/{publishId}/{problemId}") + @Operation(summary = "문항 조회", description = "사용자에게 보여지는 문항을 조회합니다.") + public ResponseEntity getProblem( + @PathVariable("publishId") Long publishId, + @PathVariable("problemId") Long problemId, + @AuthUser Member member + ) { + return ResponseEntity.ok(problemsGetService.getProblem(member.getId(), publishId, problemId)); + } + + @GetMapping("problem/{publishId}/{problemId}/{childProblemId}") + @Operation(summary = "새끼문항 조회", description = "사용자에게 보여지는 새끼문항을 조회합니다.") + public ResponseEntity getChildProblem( + @PathVariable("publishId") Long publishId, + @PathVariable("problemId") Long problemId, + @PathVariable("childProblemId") Long childProblemId, + @AuthUser Member member + ) { + return ResponseEntity.ok( + problemsGetService.getChildProblem(member.getId(), publishId, problemId, childProblemId)); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/AllProblemGetResponse.java b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/AllProblemGetResponse.java similarity index 86% rename from src/main/java/com/moplus/moplus_server/client/submit/dto/response/AllProblemGetResponse.java rename to src/main/java/com/moplus/moplus_server/client/problem/dto/response/AllProblemGetResponse.java index 91c3c6fa..5ae37bea 100644 --- a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/AllProblemGetResponse.java +++ b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/AllProblemGetResponse.java @@ -1,6 +1,7 @@ -package com.moplus.moplus_server.client.submit.dto.response; +package com.moplus.moplus_server.client.problem.dto.response; import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus; +import com.moplus.moplus_server.client.submit.dto.response.DayProgress; import java.time.LocalDate; import java.util.List; import lombok.Builder; diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ChildProblemClientGetResponse.java b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/ChildProblemClientGetResponse.java similarity index 92% rename from src/main/java/com/moplus/moplus_server/client/submit/dto/response/ChildProblemClientGetResponse.java rename to src/main/java/com/moplus/moplus_server/client/problem/dto/response/ChildProblemClientGetResponse.java index f299d37b..5894d6e3 100644 --- a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ChildProblemClientGetResponse.java +++ b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/ChildProblemClientGetResponse.java @@ -1,4 +1,4 @@ -package com.moplus.moplus_server.client.submit.dto.response; +package com.moplus.moplus_server.client.problem.dto.response; import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus; import lombok.Builder; diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ProblemClientGetResponse.java b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/ProblemClientGetResponse.java similarity index 83% rename from src/main/java/com/moplus/moplus_server/client/submit/dto/response/ProblemClientGetResponse.java rename to src/main/java/com/moplus/moplus_server/client/problem/dto/response/ProblemClientGetResponse.java index 5ab0f5b5..4e8b682b 100644 --- a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ProblemClientGetResponse.java +++ b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/ProblemClientGetResponse.java @@ -1,4 +1,4 @@ -package com.moplus.moplus_server.client.submit.dto.response; +package com.moplus.moplus_server.client.problem.dto.response; import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus; import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus; @@ -15,7 +15,8 @@ public record ProblemClientGetResponse( ProblemSubmitStatus status, List childProblemStatuses ) { - public static ProblemClientGetResponse of(Problem problem, ProblemSubmitStatus status, List childProblemStatuses, int number) { + public static ProblemClientGetResponse of(Problem problem, ProblemSubmitStatus status, + List childProblemStatuses, int number) { return ProblemClientGetResponse.builder() .number(number) .imageUrl(problem.getMainProblemImageUrl()) diff --git a/src/main/java/com/moplus/moplus_server/client/problem/dto/response/PublishClientGetResponse.java b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/PublishClientGetResponse.java new file mode 100644 index 00000000..00a08a19 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/PublishClientGetResponse.java @@ -0,0 +1,26 @@ +package com.moplus.moplus_server.client.problem.dto.response; + +import com.moplus.moplus_server.admin.publish.domain.Publish; +import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; +import java.time.LocalDate; +import java.util.List; +import lombok.Builder; + +@Builder +public record PublishClientGetResponse( + Long publishId, + LocalDate date, + String title, + List problems +) { + + public static PublishClientGetResponse of(Publish publish, ProblemSet problemSet, + List problems) { + return PublishClientGetResponse.builder() + .publishId(publish.getId()) + .date(publish.getPublishedDate()) + .title(problemSet.getTitle().getValue()) + .problems(problems) + .build(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/service/ProblemsGetService.java b/src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java similarity index 66% rename from src/main/java/com/moplus/moplus_server/client/submit/service/ProblemsGetService.java rename to src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java index ecf174e5..fd50b575 100644 --- a/src/main/java/com/moplus/moplus_server/client/submit/service/ProblemsGetService.java +++ b/src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java @@ -1,15 +1,16 @@ -package com.moplus.moplus_server.client.submit.service; +package com.moplus.moplus_server.client.problem.service; import com.moplus.moplus_server.admin.publish.domain.Publish; +import com.moplus.moplus_server.client.problem.dto.response.AllProblemGetResponse; +import com.moplus.moplus_server.client.problem.dto.response.ChildProblemClientGetResponse; +import com.moplus.moplus_server.client.problem.dto.response.ProblemClientGetResponse; +import com.moplus.moplus_server.client.problem.dto.response.PublishClientGetResponse; import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmit; import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus; import com.moplus.moplus_server.client.submit.domain.ProblemSubmit; import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus; -import com.moplus.moplus_server.client.submit.dto.response.AllProblemGetResponse; -import com.moplus.moplus_server.client.submit.dto.response.ChildProblemClientGetResponse; import com.moplus.moplus_server.client.submit.dto.response.DayProgress; -import com.moplus.moplus_server.client.submit.dto.response.ProblemClientGetResponse; import com.moplus.moplus_server.client.submit.repository.ChildProblemSubmitRepository; import com.moplus.moplus_server.client.submit.repository.ProblemSubmitRepository; import com.moplus.moplus_server.domain.problem.domain.childProblem.ChildProblem; @@ -25,6 +26,7 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.List; +import java.util.stream.IntStream; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -33,18 +35,33 @@ @RequiredArgsConstructor public class ProblemsGetService { + private static final int MIN_MONTH = 1; + private static final int MAX_MONTH = 12; private final PublishRepository publishRepository; private final ProblemSubmitRepository problemSubmitRepository; private final ProblemRepository problemRepository; private final ProblemSetRepository problemSetRepository; private final ChildProblemSubmitRepository childProblemSubmitRepository; private final ChildProblemRepository childProblemRepository; - private static final int MIN_MONTH = 1; - private static final int MAX_MONTH = 12; @Transactional(readOnly = true) - public List getAllProblem(int year, int month) { - Long memberId = 1L; + public PublishClientGetResponse getProblemsInPublish(Long memberId, Long publishId) { + Publish publish = publishRepository.findByIdElseThrow(publishId); + denyAccessToFuturePublish(publish); + + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(publish.getProblemSetId()); + List problemIds = problemSet.getProblemIds(); + List problems = problemRepository.findAllById(problemIds); + + List problemClientGetResponses = IntStream.range(0, problems.size()) + .mapToObj(i -> getProblemStatus(memberId, publishId, problems.get(i).getId(), i + 1)) + .toList(); + + return PublishClientGetResponse.of(publish, problemSet, problemClientGetResponses); + } + + @Transactional(readOnly = true) + public List getAllProblem(Long memberId, int year, int month) { if (month < MIN_MONTH || month > MAX_MONTH) { throw new InvalidValueException(ErrorCode.INVALID_MONTH_ERROR); @@ -67,7 +84,7 @@ public List getAllProblem(int year, int month) { // 날짜별 사용자 제출 정보 조회 List submissions = problemSubmitRepository.findByMemberIdAndPublishId(memberId, publishId); List problemStatuses = submissions.stream() - .map(ProblemSubmit::getStatus ) + .map(ProblemSubmit::getStatus) .toList(); // 사용자 제출 정보 바탕으로 진행도 결정 @@ -88,8 +105,7 @@ private String getMainProblemImageUrl(Long problemSetId) { } @Transactional(readOnly = true) - public ProblemClientGetResponse getProblem(Long publishId, Long problemId) { - Long memberId = 1L; + public ProblemClientGetResponse getProblem(Long memberId, Long publishId, Long problemId) { // 발행 조회 Publish publish = publishRepository.findByIdElseThrow(publishId); @@ -116,7 +132,7 @@ public ProblemClientGetResponse getProblem(Long publishId, Long problemId) { .toList(); List childProblemStatuses = childProblemSubmitRepository.findAllByMemberIdAndPublishIdAndChildProblemIdIn( - memberId, publishId, childProblemIds).stream() + memberId, publishId, childProblemIds).stream() .map(ChildProblemSubmit::getStatus) .toList(); @@ -124,8 +140,8 @@ public ProblemClientGetResponse getProblem(Long publishId, Long problemId) { } @Transactional(readOnly = true) - public ChildProblemClientGetResponse getChildProblem(Long publishId, Long problemId, Long childProblemId) { - Long memberId = 1L; + public ChildProblemClientGetResponse getChildProblem(Long memberId, Long publishId, Long problemId, + Long childProblemId) { // 발행 조회 Publish publish = publishRepository.findByIdElseThrow(publishId); @@ -155,12 +171,45 @@ public ChildProblemClientGetResponse getChildProblem(Long publishId, Long proble throw new NotFoundException(ErrorCode.PROBLEM_NOT_FOUND_IN_PROBLEM_SET); } - return ChildProblemClientGetResponse.of(problemNumber + 1, childProblemNumber + 1, childProblem.getImageUrl(), childProblemSubmit.getStatus()); + return ChildProblemClientGetResponse.of(problemNumber + 1, childProblemNumber + 1, childProblem.getImageUrl(), + childProblemSubmit.getStatus()); } - private void denyAccessToFuturePublish(Publish publish){ + private void denyAccessToFuturePublish(Publish publish) { if (publish.getPublishedDate().isAfter(LocalDate.now())) { throw new InvalidValueException(ErrorCode.FUTURE_PUBLISH_NOT_ACCESSIBLE); } } + + private ProblemClientGetResponse getProblemStatus(Long memberId, Long publishId, Long problemId, int number) { + // 문항 조회 + Problem problem = problemRepository.findByIdElseThrow(problemId); + + // 문항 제출 상태 조회 (없으면 NOT_STARTED) + ProblemSubmitStatus problemStatus = problemSubmitRepository + .findByMemberIdAndPublishIdAndProblemId(memberId, publishId, problemId) + .map(ProblemSubmit::getStatus) + .orElse(ProblemSubmitStatus.NOT_STARTED); + + // 새끼 문항 제출 상태 조회 + List childProblemIds = problem.getChildProblems().stream() + .map(ChildProblem::getId) + .toList(); + + List childProblemStatuses = new ArrayList<>(childProblemSubmitRepository + .findAllByMemberIdAndPublishIdAndChildProblemIdIn(memberId, publishId, childProblemIds) + .stream() + .map(ChildProblemSubmit::getStatus) + .toList()); + + // 새끼 문항이 있는데 제출 상태가 없는 경우 NOT_STARTED 추가 + if (childProblemStatuses.size() < childProblemIds.size()) { + int remainingCount = childProblemIds.size() - childProblemStatuses.size(); + for (int i = 0; i < remainingCount; i++) { + childProblemStatuses.add(ChildProblemSubmitStatus.NOT_STARTED); + } + } + + return ProblemClientGetResponse.of(problem, problemStatus, childProblemStatuses, number); + } } diff --git a/src/main/java/com/moplus/moplus_server/client/submit/controller/ProblemGetController.java b/src/main/java/com/moplus/moplus_server/client/submit/controller/ProblemGetController.java deleted file mode 100644 index 0f2ee303..00000000 --- a/src/main/java/com/moplus/moplus_server/client/submit/controller/ProblemGetController.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.moplus.moplus_server.client.submit.controller; - -import com.moplus.moplus_server.client.submit.dto.response.AllProblemGetResponse; -import com.moplus.moplus_server.client.submit.dto.response.ChildProblemClientGetResponse; -import com.moplus.moplus_server.client.submit.dto.response.ProblemClientGetResponse; -import com.moplus.moplus_server.client.submit.service.ProblemsGetService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import java.util.List; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "클라이언트 문제 조회", description = "클라이언트 문제 조회 관련 API") -@RestController -@RequestMapping("/api/v1/client") -@RequiredArgsConstructor -public class ProblemGetController { - - private final ProblemsGetService problemsGetService; - - @GetMapping("problem/all/{year}/{month}") - @Operation(summary = "전체 문제 조회", description = "월별 문제들에 대한 진행도와 정보들을 조회합니다.") - public ResponseEntity> getAllProblem( - @PathVariable int year, - @PathVariable int month - ) { - return ResponseEntity.ok(problemsGetService.getAllProblem(year, month)); - } - - @GetMapping("problem/{publishId}/{problemId}") - @Operation(summary = "문항 조회", description = "사용자에게 보여지는 문항을 조회합니다.") - public ResponseEntity getProblem( - @PathVariable Long publishId, - @PathVariable Long problemId - ) { - return ResponseEntity.ok(problemsGetService.getProblem(publishId, problemId)); - } - - @GetMapping("problem/{publishId}/{problemId}/{childProblemId}") - @Operation(summary = "새끼문항 조회", description = "사용자에게 보여지는 새끼문항을 조회합니다.") - public ResponseEntity getChildProblem( - @PathVariable Long publishId, - @PathVariable Long problemId, - @PathVariable Long childProblemId - ) { - return ResponseEntity.ok(problemsGetService.getChildProblem(publishId, problemId, childProblemId)); - } -} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/domain/ProblemSubmitStatus.java b/src/main/java/com/moplus/moplus_server/client/submit/domain/ProblemSubmitStatus.java index 34bb4d45..2ccaadea 100644 --- a/src/main/java/com/moplus/moplus_server/client/submit/domain/ProblemSubmitStatus.java +++ b/src/main/java/com/moplus/moplus_server/client/submit/domain/ProblemSubmitStatus.java @@ -4,7 +4,9 @@ public enum ProblemSubmitStatus { CORRECT, INCORRECT, IN_PROGRESS, - RETRY_CORRECT; + RETRY_CORRECT, + NOT_STARTED, + ; public static ProblemSubmitStatus determineStatus(ProblemSubmitStatus currentStatus, String memberAnswer, String problemAnswer) { boolean isCorrect = problemAnswer.trim().equals(memberAnswer.trim()); @@ -12,6 +14,7 @@ public static ProblemSubmitStatus determineStatus(ProblemSubmitStatus currentSta case CORRECT -> isCorrect ? CORRECT : INCORRECT; case INCORRECT -> isCorrect ? RETRY_CORRECT : INCORRECT; case IN_PROGRESS -> isCorrect ? CORRECT : INCORRECT; + case NOT_STARTED -> isCorrect ? CORRECT : INCORRECT; default -> isCorrect ? RETRY_CORRECT : INCORRECT; }; } From 19049c36e34a77e7a5d8ae79e3815d0bc4f86da1 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 03:13:46 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[feat/#102]=20=EB=B0=9C=ED=96=89=20?= =?UTF-8?q?=EC=86=8D=20=EB=AC=B8=ED=95=AD=20=EC=A1=B0=ED=9A=8C=20api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProblemFeedProgressesGetResponse.java | 22 +++++++++++++++++++ .../response/PublishClientGetResponse.java | 4 ++-- .../problem/service/ProblemsGetService.java | 8 ++++--- 3 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/moplus/moplus_server/client/problem/dto/response/ProblemFeedProgressesGetResponse.java diff --git a/src/main/java/com/moplus/moplus_server/client/problem/dto/response/ProblemFeedProgressesGetResponse.java b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/ProblemFeedProgressesGetResponse.java new file mode 100644 index 00000000..75524804 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/ProblemFeedProgressesGetResponse.java @@ -0,0 +1,22 @@ +package com.moplus.moplus_server.client.problem.dto.response; + +import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus; +import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus; +import java.util.List; +import lombok.Builder; + +@Builder +public record ProblemFeedProgressesGetResponse( + int number, + ProblemSubmitStatus status, + List childProblemStatuses +) { + public static ProblemFeedProgressesGetResponse of(ProblemSubmitStatus status, + List childProblemStatuses, int number) { + return ProblemFeedProgressesGetResponse.builder() + .number(number) + .status(status) + .childProblemStatuses(childProblemStatuses) + .build(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/problem/dto/response/PublishClientGetResponse.java b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/PublishClientGetResponse.java index 00a08a19..d0ba4f4e 100644 --- a/src/main/java/com/moplus/moplus_server/client/problem/dto/response/PublishClientGetResponse.java +++ b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/PublishClientGetResponse.java @@ -11,11 +11,11 @@ public record PublishClientGetResponse( Long publishId, LocalDate date, String title, - List problems + List problems ) { public static PublishClientGetResponse of(Publish publish, ProblemSet problemSet, - List problems) { + List problems) { return PublishClientGetResponse.builder() .publishId(publish.getId()) .date(publish.getPublishedDate()) diff --git a/src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java b/src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java index fd50b575..9f7f0b40 100644 --- a/src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java +++ b/src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java @@ -5,6 +5,7 @@ import com.moplus.moplus_server.client.problem.dto.response.AllProblemGetResponse; import com.moplus.moplus_server.client.problem.dto.response.ChildProblemClientGetResponse; import com.moplus.moplus_server.client.problem.dto.response.ProblemClientGetResponse; +import com.moplus.moplus_server.client.problem.dto.response.ProblemFeedProgressesGetResponse; import com.moplus.moplus_server.client.problem.dto.response.PublishClientGetResponse; import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmit; import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus; @@ -53,7 +54,7 @@ public PublishClientGetResponse getProblemsInPublish(Long memberId, Long publish List problemIds = problemSet.getProblemIds(); List problems = problemRepository.findAllById(problemIds); - List problemClientGetResponses = IntStream.range(0, problems.size()) + List problemClientGetResponses = IntStream.range(0, problems.size()) .mapToObj(i -> getProblemStatus(memberId, publishId, problems.get(i).getId(), i + 1)) .toList(); @@ -181,7 +182,8 @@ private void denyAccessToFuturePublish(Publish publish) { } } - private ProblemClientGetResponse getProblemStatus(Long memberId, Long publishId, Long problemId, int number) { + private ProblemFeedProgressesGetResponse getProblemStatus(Long memberId, Long publishId, Long problemId, + int number) { // 문항 조회 Problem problem = problemRepository.findByIdElseThrow(problemId); @@ -210,6 +212,6 @@ private ProblemClientGetResponse getProblemStatus(Long memberId, Long publishId, } } - return ProblemClientGetResponse.of(problem, problemStatus, childProblemStatuses, number); + return ProblemFeedProgressesGetResponse.of(problemStatus, childProblemStatuses, number); } }