Skip to content

Commit 2d598e0

Browse files
committed
[feat/#94] 전체문제 조회 api 구현
1 parent 4f2ab0c commit 2d598e0

File tree

9 files changed

+161
-0
lines changed

9 files changed

+161
-0
lines changed

src/main/java/com/moplus/moplus_server/client/submit/controller/.gitkeep

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.moplus.moplus_server.client.submit.controller;
2+
3+
import com.moplus.moplus_server.client.submit.dto.response.AllProblemGetResponse;
4+
import com.moplus.moplus_server.client.submit.service.ClientGetService;
5+
import io.swagger.v3.oas.annotations.Operation;
6+
import io.swagger.v3.oas.annotations.tags.Tag;
7+
import java.util.List;
8+
import lombok.RequiredArgsConstructor;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.web.bind.annotation.GetMapping;
11+
import org.springframework.web.bind.annotation.PathVariable;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
@Tag(name = "클라이언트 조회", description = "클라이언트 조회 관련 API")
16+
@RestController
17+
@RequestMapping("/api/v1/client")
18+
@RequiredArgsConstructor
19+
public class ClientGetController {
20+
21+
private final ClientGetService clientGetService;
22+
23+
@GetMapping("allProblem/{year}/{month}")
24+
@Operation(summary = "전체 문제 조회", description = "월별 문제들에 대한 진행도와 정보들을 조회합니다.")
25+
public ResponseEntity<List<AllProblemGetResponse>> getAllProblem(
26+
@PathVariable int year,
27+
@PathVariable int month
28+
) {
29+
return ResponseEntity.ok(clientGetService.getAllProblem(year, month));
30+
}
31+
}

src/main/java/com/moplus/moplus_server/client/submit/dto/.gitkeep

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.moplus.moplus_server.client.submit.dto.response;
2+
3+
import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus;
4+
import java.time.LocalDate;
5+
import java.util.List;
6+
import lombok.Builder;
7+
8+
@Builder
9+
public record AllProblemGetResponse(
10+
Long publishId,
11+
LocalDate date,
12+
DayProgress progress,
13+
List<ProblemSubmitStatus> problemStatuses,
14+
String mainProblemImageUrl
15+
) {
16+
public static AllProblemGetResponse of(Long publishId, LocalDate date, DayProgress progress,
17+
List<ProblemSubmitStatus> problemStatuses, String mainProblemImageUrl) {
18+
return AllProblemGetResponse.builder()
19+
.publishId(publishId)
20+
.date(date)
21+
.progress(progress)
22+
.problemStatuses(problemStatuses)
23+
.mainProblemImageUrl(mainProblemImageUrl)
24+
.build();
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.moplus.moplus_server.client.submit.dto.response;
2+
3+
import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus;
4+
import java.util.List;
5+
6+
public enum DayProgress {
7+
COMPLETE,
8+
INCOMPLETE,
9+
IN_PROGRESS;
10+
public static DayProgress determineDayProgress(List<ProblemSubmitStatus> problemStatuses) {
11+
if (problemStatuses.isEmpty()) {
12+
return INCOMPLETE;
13+
}
14+
else if (problemStatuses.contains(ProblemSubmitStatus.IN_PROGRESS)) {
15+
return IN_PROGRESS;
16+
}
17+
else{
18+
return COMPLETE;
19+
}
20+
}
21+
}

src/main/java/com/moplus/moplus_server/client/submit/repository/.gitkeep

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.moplus.moplus_server.client.submit.repository;
2+
3+
import com.moplus.moplus_server.client.submit.domain.ProblemSubmit;
4+
import java.util.List;
5+
import org.springframework.data.jpa.repository.JpaRepository;
6+
7+
public interface ProblemSubmitRepository extends JpaRepository<ProblemSubmit, Long> {
8+
List<ProblemSubmit> findByMemberIdAndPublishId(Long memberId, Long publishId);
9+
}

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

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.moplus.moplus_server.client.submit.service;
2+
3+
4+
import com.moplus.moplus_server.admin.publish.domain.Publish;
5+
import com.moplus.moplus_server.client.submit.domain.ProblemSubmit;
6+
import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus;
7+
import com.moplus.moplus_server.client.submit.dto.response.AllProblemGetResponse;
8+
import com.moplus.moplus_server.client.submit.dto.response.DayProgress;
9+
import com.moplus.moplus_server.client.submit.repository.ProblemSubmitRepository;
10+
import com.moplus.moplus_server.domain.problem.domain.problem.Problem;
11+
import com.moplus.moplus_server.domain.problem.repository.ProblemRepository;
12+
import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository;
13+
import com.moplus.moplus_server.domain.publish.repository.PublishRepository;
14+
import com.moplus.moplus_server.global.error.exception.ErrorCode;
15+
import com.moplus.moplus_server.global.error.exception.InvalidValueException;
16+
import java.time.LocalDate;
17+
import java.util.ArrayList;
18+
import java.util.List;
19+
import lombok.RequiredArgsConstructor;
20+
import org.springframework.stereotype.Service;
21+
import org.springframework.transaction.annotation.Transactional;
22+
23+
@Service
24+
@RequiredArgsConstructor
25+
public class ClientGetService {
26+
27+
private final PublishRepository publishRepository;
28+
private final ProblemSubmitRepository problemSubmitRepository;
29+
private final ProblemRepository problemRepository;
30+
private final ProblemSetRepository problemSetRepository;
31+
32+
@Transactional(readOnly = true)
33+
public List<AllProblemGetResponse> getAllProblem(int year, int month) {
34+
35+
Long memberId = 1L;
36+
37+
if (month < 1 || month > 12) {
38+
throw new InvalidValueException(ErrorCode.INVALID_MONTH_ERROR);
39+
}
40+
LocalDate startDate = LocalDate.of(year, month, 1);
41+
LocalDate endDate = startDate.withDayOfMonth(startDate.lengthOfMonth());
42+
43+
// 해당 월 모든 Publish 조회
44+
List<Publish> publishes = publishRepository.findByPublishedDateBetween(startDate, endDate);
45+
46+
List<AllProblemGetResponse> result = new ArrayList<>();
47+
48+
for (Publish publish : publishes) {
49+
Long publishId = publish.getId();
50+
LocalDate date = publish.getPublishedDate();
51+
52+
// 날짜별 사용자 제출 정보 조회
53+
List<ProblemSubmit> submissions = problemSubmitRepository.findByMemberIdAndPublishId(memberId, publishId);
54+
List<ProblemSubmitStatus> problemStatuses = submissions.stream()
55+
.map(ProblemSubmit::getStatus)
56+
.toList();
57+
58+
// 사용자 제출 정보 바탕으로 진행도 결정
59+
DayProgress progress = DayProgress.determineDayProgress(problemStatuses);
60+
String mainProblemImageUrl = getMainProblemImageUrl(publish.getProblemSetId());
61+
62+
result.add(AllProblemGetResponse.of(publishId, date, progress, problemStatuses, mainProblemImageUrl));
63+
}
64+
return result;
65+
}
66+
67+
private String getMainProblemImageUrl(Long problemSetId) {
68+
return problemSetRepository.findById(problemSetId)
69+
.flatMap(problemSet -> problemSet.getProblemIds().stream().findFirst())
70+
.flatMap(problemRepository::findById)
71+
.map(Problem::getMainProblemImageUrl)
72+
.orElse(null);
73+
}
74+
}

0 commit comments

Comments
 (0)