Skip to content

Commit acb35dd

Browse files
committed
[fix] 홈피드 문항 번호로 세트 조회하던 문제 해결 및 풀이 횟수 통계 업데이트
1 parent 6f8dd54 commit acb35dd

File tree

6 files changed

+86
-47
lines changed

6 files changed

+86
-47
lines changed

src/main/java/com/moplus/moplus_server/client/homefeed/service/HomeFeedFacadeService.java

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.moplus.moplus_server.client.submit.service.ProblemSubmitGetService;
1111
import com.moplus.moplus_server.domain.problemset.service.ProblemSetGetService;
1212
import com.moplus.moplus_server.member.domain.Member;
13-
import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic;
1413
import com.moplus.moplus_server.statistic.Problem.repository.ProblemSetStatisticRepository;
1514
import java.time.DayOfWeek;
1615
import java.time.LocalDate;
@@ -38,28 +37,23 @@ public class HomeFeedFacadeService {
3837

3938
@Transactional(readOnly = true)
4039
public HomeFeedResponse getHomeFeed(Member member) {
41-
log.info("홈피드 조회 시작 - memberId: {}, 조회 기간: {} ~ {}", member.getId(), monday, friday);
4240
Long memberId = member.getId();
4341

4442
List<Publish> publishes = publishGetService.getPublishesBetweenDates(monday, friday);
45-
log.info("조회된 발행 개수: {}", publishes.size());
4643

4744
List<DailyProgressResponse> dailyProgresses = getDailyProgresses(memberId, publishes);
48-
log.info("일일 진행 현황 생성 완료 - 개수: {}", dailyProgresses.size());
4945

5046
List<ProblemSetHomeFeedResponse> problemSets = getWeekdayProblemSets(publishes);
51-
log.info("문제 세트 응답 생성 완료 - 개수: {}", problemSets.size());
5247

5348
return HomeFeedResponse.of(dailyProgresses, problemSets);
5449
}
5550

5651
private List<DailyProgressResponse> getDailyProgresses(Long memberId, List<Publish> publishes) {
57-
log.info("일일 진행 현황 조회 시작 - memberId: {}", memberId);
58-
59-
Map<LocalDate, ProgressStatus> progressStatuses = problemSubmitGetService.getProgressStatuses(memberId, publishes);
60-
log.info("진행 상태 조회 완료 - 상태 개수: {}", progressStatuses.size());
61-
progressStatuses.forEach((date, status) ->
62-
log.info("진행 상태 - 날짜: {}, 상태: {}", date, status));
52+
53+
Map<LocalDate, ProgressStatus> progressStatuses = problemSubmitGetService.getProgressStatuses(memberId,
54+
publishes);
55+
progressStatuses.forEach((date, status) ->
56+
log.info("진행 상태 - 날짜: {}, 상태: {}", date, status));
6357

6458
List<DailyProgressResponse> responses = new ArrayList<>();
6559
for (LocalDate date = monday; !date.isAfter(friday); date = date.plusDays(1)) {
@@ -72,37 +66,31 @@ private List<DailyProgressResponse> getDailyProgresses(Long memberId, List<Publi
7266
}
7367

7468
private List<ProblemSetHomeFeedResponse> getWeekdayProblemSets(List<Publish> publishes) {
75-
log.info("주간 문제 세트 조회 시작 - 발행 개수: {}", publishes.size());
7669

7770
Map<LocalDate, Publish> publishByDate = publishes.stream()
7871
.collect(Collectors.toMap(Publish::getPublishedDate, publish -> publish));
79-
log.info("날짜별 발행 매핑 완료 - 매핑 개수: {}", publishByDate.size());
8072

81-
publishByDate.forEach((date, publish) ->
82-
log.info("발행 정보 - 날짜: {}, 발행 ID: {}, 문제 세트 ID: {}",
83-
date, publish.getId(), publish.getProblemSetId()));
73+
publishByDate.forEach((date, publish) ->
74+
log.info("발행 정보 - 날짜: {}, 발행 ID: {}, 문제 세트 ID: {}",
75+
date, publish.getId(), publish.getProblemSetId()));
8476

8577
List<Long> problemSetIds = publishes.stream()
8678
.map(Publish::getProblemSetId)
8779
.toList();
88-
log.info("문제 세트 ID 추출 완료 - ID 목록: {}", problemSetIds);
8980

9081
Map<Long, ProblemSetGetResponse> problemSetMap = problemSetGetService.getProblemSets(problemSetIds).stream()
9182
.collect(Collectors.toMap(ProblemSetGetResponse::id, response -> response));
92-
log.info("문제 세트 정보 조회 완료 - 조회된 세트 개수: {}", problemSetMap.size());
9383

9484
List<ProblemSetHomeFeedResponse> responses = new ArrayList<>();
9585
for (LocalDate date = monday; !date.isAfter(friday); date = date.plusDays(1)) {
96-
log.info("날짜별 응답 생성 시작 - 날짜: {}", date);
97-
86+
9887
Publish publish = publishByDate.get(date);
9988
if (publish != null) {
10089
ProblemSetGetResponse problemSet = problemSetMap.get(publish.getProblemSetId());
101-
Long submitCount = problemSetStatisticRepository.findById(problemSet.id())
102-
.map(ProblemSetStatistic::getSubmitCount)
103-
.orElse(0L);
104-
105-
log.info("응답 생성 - 날짜: {}, 발행 ID: {}, 문제 세트 ID: {}, 제출 수: {}",
90+
Long submitCount = problemSetStatisticRepository.findByProblemSetIdElseThrow(problemSet.id())
91+
.getSubmitCount();
92+
93+
log.info("응답 생성 - 날짜: {}, 발행 ID: {}, 문제 세트 ID: {}, 제출 수: {}",
10694
date, publish.getId(), problemSet.id(), submitCount);
10795
responses.add(ProblemSetHomeFeedResponse.of(date, publish.getId(), problemSet, submitCount));
10896
} else {
@@ -111,7 +99,6 @@ private List<ProblemSetHomeFeedResponse> getWeekdayProblemSets(List<Publish> pub
11199
}
112100
}
113101

114-
log.info("주간 문제 세트 응답 생성 완료 - 총 응답 개수: {}", responses.size());
115102
return responses;
116103
}
117104
}

src/main/java/com/moplus/moplus_server/client/submit/service/ClientSubmitService.java

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.moplus.moplus_server.client.submit.service;
22

33

4+
import com.moplus.moplus_server.admin.publish.domain.Publish;
45
import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmit;
56
import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus;
67
import com.moplus.moplus_server.client.submit.domain.ProblemSubmit;
@@ -17,7 +18,13 @@
1718
import com.moplus.moplus_server.domain.problem.domain.problem.Problem;
1819
import com.moplus.moplus_server.domain.problem.repository.ChildProblemRepository;
1920
import com.moplus.moplus_server.domain.problem.repository.ProblemRepository;
21+
import com.moplus.moplus_server.domain.problemset.domain.ProblemSet;
22+
import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository;
23+
import com.moplus.moplus_server.domain.problemset.service.ProblemSetGetService;
2024
import com.moplus.moplus_server.domain.publish.repository.PublishRepository;
25+
import com.moplus.moplus_server.statistic.Problem.domain.StatisticEntityTarget;
26+
import com.moplus.moplus_server.statistic.Problem.service.CountStatisticsGetService;
27+
import com.moplus.moplus_server.statistic.Problem.service.CountStatisticsUpdateService;
2128
import java.util.List;
2229
import java.util.Optional;
2330
import lombok.RequiredArgsConstructor;
@@ -33,22 +40,39 @@ public class ClientSubmitService {
3340
private final ChildProblemSubmitRepository childProblemSubmitRepository;
3441
private final PublishRepository publishRepository;
3542
private final ChildProblemRepository childProblemRepository;
43+
private final CountStatisticsUpdateService countStatisticsUpdateService;
44+
private final ProblemSetGetService problemSetGetService;
45+
private final ProblemSetRepository problemSetRepository;
46+
private final CountStatisticsGetService countStatisticsGetService;
47+
48+
private static Long getFirstProblemInProblemSet(ProblemSet problemSet) {
49+
return problemSet.getProblemIds().get(0);
50+
}
3651

3752
@Transactional
3853
public void createProblemSubmit(Long memberId, ProblemSubmitCreateRequest request) {
3954

4055
// 존재하는 발행인지 검증
41-
publishRepository.existsByIdElseThrow(request.publishId());
56+
Publish publish = publishRepository.findByIdElseThrow(request.publishId());
4257
// 존재하는 문항인지 검증
4358
problemRepository.existsByIdElseThrow(request.problemId());
4459

4560
// 제출이력이 없을때만 생성
46-
Optional<ProblemSubmit> existingProblemSubmit = problemSubmitRepository.findByMemberIdAndPublishIdAndProblemId(memberId,
61+
Optional<ProblemSubmit> existingProblemSubmit = problemSubmitRepository.findByMemberIdAndPublishIdAndProblemId(
62+
memberId,
4763
request.publishId(), request.problemId());
4864
if (existingProblemSubmit.isEmpty()) {
4965
ProblemSubmit problemSubmit = request.toEntity(memberId);
5066
problemSubmitRepository.save(problemSubmit);
5167
}
68+
69+
//문제 풀이 통계 업데이트
70+
countStatisticsUpdateService.createStatistics(request.problemId(), StatisticEntityTarget.PROBLEM);
71+
ProblemSet problemSet = problemSetRepository.findByIdElseThrow(publish.getProblemSetId());
72+
if (getFirstProblemInProblemSet(problemSet).equals(request.problemId())) {
73+
//TODO: 현재는 첫번째 문항을 풀었을 때 set 풀이 count가 올라가지만 나중에는 어떤 문제를 풀든 첫 문제를 풀면 count가 올라가야해요
74+
countStatisticsUpdateService.createStatistics(publish.getProblemSetId(), StatisticEntityTarget.PROBLEM_SET);
75+
}
5276
}
5377

5478
@Transactional
@@ -80,7 +104,8 @@ public void createChildProblemSubmit(Long memberId, ChildProblemSubmitCreateRequ
80104
problemRepository.existsByIdElseThrow(request.problemId());
81105

82106
// 문항제출 이력이 없으면 문항제출 생성
83-
Optional<ProblemSubmit> existingProblemSubmit = problemSubmitRepository.findByMemberIdAndPublishIdAndProblemId(memberId,
107+
Optional<ProblemSubmit> existingProblemSubmit = problemSubmitRepository.findByMemberIdAndPublishIdAndProblemId(
108+
memberId,
84109
request.publishId(), request.problemId());
85110
if (existingProblemSubmit.isEmpty()) {
86111
ProblemSubmit problemSubmit = ProblemSubmit.builder()
@@ -100,7 +125,8 @@ public void createChildProblemSubmit(Long memberId, ChildProblemSubmitCreateRequ
100125
for (ChildProblem childProblem : childProblems) {
101126
Long childProblemId = childProblem.getId();
102127

103-
Optional<ChildProblemSubmit> existingChildProblemSubmit = childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemId(memberId,
128+
Optional<ChildProblemSubmit> existingChildProblemSubmit = childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemId(
129+
memberId,
104130
request.publishId(), childProblemId);
105131
if (existingChildProblemSubmit.isEmpty()) {
106132
ChildProblemSubmit childProblemSubmit = ChildProblemSubmit.builder()
@@ -115,7 +141,8 @@ public void createChildProblemSubmit(Long memberId, ChildProblemSubmitCreateRequ
115141
}
116142

117143
@Transactional
118-
public ChildProblemSubmitUpdateResponse updateChildProblemSubmit(Long memberId, ChildProblemSubmitUpdateRequest request) {
144+
public ChildProblemSubmitUpdateResponse updateChildProblemSubmit(Long memberId,
145+
ChildProblemSubmitUpdateRequest request) {
119146

120147
// 존재하는 발행인지 검증
121148
publishRepository.existsByIdElseThrow(request.publishId());
@@ -124,10 +151,12 @@ public ChildProblemSubmitUpdateResponse updateChildProblemSubmit(Long memberId,
124151
ChildProblem childProblem = childProblemRepository.findByIdElseThrow(request.childProblemId());
125152

126153
//새끼문항 제출 데이터 조회
127-
ChildProblemSubmit childProblemSubmit = childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemIdElseThrow(memberId,
154+
ChildProblemSubmit childProblemSubmit = childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemIdElseThrow(
155+
memberId,
128156
request.publishId(), request.childProblemId());
129157
// 제출한 답안에 대한 상태 결정
130-
ChildProblemSubmitStatus status = ChildProblemSubmitStatus.determineStatus(childProblemSubmit.getStatus(), request.answer(),
158+
ChildProblemSubmitStatus status = ChildProblemSubmitStatus.determineStatus(childProblemSubmit.getStatus(),
159+
request.answer(),
131160
childProblem.getAnswer());
132161

133162
childProblemSubmit.updateStatus(status);
@@ -144,7 +173,8 @@ public void updateChildProblemSubmitIncorrect(Long memberId, ChildProblemSubmitU
144173
ChildProblem childProblem = childProblemRepository.findByIdElseThrow(request.childProblemId());
145174

146175
//새끼문항 제출 데이터 조회
147-
ChildProblemSubmit childProblemSubmit = childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemIdElseThrow(memberId,
176+
ChildProblemSubmit childProblemSubmit = childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemIdElseThrow(
177+
memberId,
148178
request.publishId(), request.childProblemId());
149179
// 틀림 처리
150180
childProblemSubmit.updateStatusIncorrect();

src/main/java/com/moplus/moplus_server/client/submit/service/ProblemSubmitGetService.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ public class ProblemSubmitGetService {
2222
private final ProblemSetRepository problemSetRepository;
2323

2424
@Transactional(readOnly = true)
25-
public ProgressStatus getProgressStatus(Long memberId, Long publishId) {
25+
public ProgressStatus getProgressStatus(Long memberId, Publish publish) {
26+
Long publishId = publish.getId();
2627
List<ProblemSubmit> submits = problemSubmitRepository.findByMemberIdAndPublishId(memberId, publishId);
2728

2829
if (submits.isEmpty()) {
2930
return ProgressStatus.NOT_STARTED;
3031
}
3132

32-
ProblemSet problemSet = problemSetRepository.findByIdElseThrow(submits.get(0).getProblemId());
33+
ProblemSet problemSet = problemSetRepository.findByIdElseThrow(publish.getProblemSetId());
3334

3435
int totalProblems = problemSet.getProblemIds().size();
3536

@@ -43,8 +44,8 @@ public ProgressStatus getProgressStatus(Long memberId, Long publishId) {
4344
public Map<LocalDate, ProgressStatus> getProgressStatuses(Long memberId, List<Publish> publishes) {
4445
return publishes.stream()
4546
.collect(Collectors.toMap(
46-
Publish::getPublishedDate,
47-
publish -> getProgressStatus(memberId, publish.getId())
47+
Publish::getPublishedDate,
48+
publish -> getProgressStatus(memberId, publish)
4849
));
4950
}
5051
}

src/main/java/com/moplus/moplus_server/statistic/Problem/repository/ProblemSetStatisticRepository.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,20 @@
33
import com.moplus.moplus_server.global.error.exception.ErrorCode;
44
import com.moplus.moplus_server.global.error.exception.NotFoundException;
55
import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic;
6+
import java.util.Optional;
67
import org.springframework.data.jpa.repository.JpaRepository;
78

89
public interface ProblemSetStatisticRepository extends JpaRepository<ProblemSetStatistic, Long> {
10+
11+
Optional<ProblemSetStatistic> findByProblemSetId(Long id);
12+
13+
default ProblemSetStatistic findByProblemSetIdElseThrow(Long id) {
14+
return findByProblemSetId(id)
15+
.orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_SET_STATISTIC_NOT_FOUND));
16+
}
17+
918
default ProblemSetStatistic findByIdElseThrow(Long id) {
1019
return findById(id)
11-
.orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_SET_STATISTIC_NOT_FOUND));
20+
.orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_SET_STATISTIC_NOT_FOUND));
1221
}
1322
}

src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsGetService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class CountStatisticsGetService {
1212
private final ProblemSetStatisticRepository problemSetStatisticRepository;
1313

1414
@Transactional(readOnly = true)
15-
public Long getProblemSetCount(Long id) {
16-
return problemSetStatisticRepository.findByIdElseThrow(id).getSubmitCount();
15+
public Long getProblemSetCountBySetId(Long problemSetId) {
16+
return problemSetStatisticRepository.findByProblemSetIdElseThrow(problemSetId).getSubmitCount();
1717
}
1818
}

src/main/java/com/moplus/moplus_server/statistic/Problem/service/CountStatisticsUpdateService.java

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.moplus.moplus_server.statistic.Problem.service;
22

3+
import com.moplus.moplus_server.statistic.Problem.domain.ChildProblemStatistic;
4+
import com.moplus.moplus_server.statistic.Problem.domain.ProblemSetStatistic;
5+
import com.moplus.moplus_server.statistic.Problem.domain.ProblemStatistic;
36
import com.moplus.moplus_server.statistic.Problem.domain.StatisticCounter;
47
import com.moplus.moplus_server.statistic.Problem.domain.StatisticEntityTarget;
58
import com.moplus.moplus_server.statistic.Problem.domain.StatisticFieldType;
@@ -18,16 +21,25 @@ public class CountStatisticsUpdateService {
1821
private final ChildProblemStatisticRepository childProblemStatisticRepository;
1922

2023
@Transactional
21-
public void updateStatistics(Long id, StatisticFieldType type, StatisticEntityTarget target) {
22-
StatisticCounter statistic = findStatistic(id, target);
24+
public void updateStatistics(Long statisticId, StatisticFieldType type, StatisticEntityTarget target) {
25+
StatisticCounter statistic = findStatistic(statisticId, target);
2326
statistic.updateCount(type);
2427
}
2528

26-
private StatisticCounter findStatistic(Long id, StatisticEntityTarget target) {
29+
@Transactional
30+
public StatisticCounter createStatistics(Long statisticId, StatisticEntityTarget target) {
31+
return switch (target) {
32+
case PROBLEM -> problemStatisticRepository.save(new ProblemStatistic(statisticId));
33+
case PROBLEM_SET -> problemSetStatisticRepository.save(new ProblemSetStatistic(statisticId));
34+
case CHILD_PROBLEM -> childProblemStatisticRepository.save(new ChildProblemStatistic(statisticId));
35+
};
36+
}
37+
38+
private StatisticCounter findStatistic(Long statisticId, StatisticEntityTarget target) {
2739
return switch (target) {
28-
case PROBLEM -> problemStatisticRepository.findByIdElseThrow(id);
29-
case PROBLEM_SET -> problemSetStatisticRepository.findByIdElseThrow(id);
30-
case CHILD_PROBLEM -> childProblemStatisticRepository.findByIdElseThrow(id);
40+
case PROBLEM -> problemStatisticRepository.findByIdElseThrow(statisticId);
41+
case PROBLEM_SET -> problemSetStatisticRepository.findByIdElseThrow(statisticId);
42+
case CHILD_PROBLEM -> childProblemStatisticRepository.findByIdElseThrow(statisticId);
3143
};
3244
}
3345
}

0 commit comments

Comments
 (0)