Skip to content

Commit 955a490

Browse files
authored
Merge pull request #97 from team-ppointer/feature/#94
Feature/#94 사용자 제출 관련 api 구현
2 parents 04c233f + 5b2c7e4 commit 955a490

32 files changed

+900
-2
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,71 @@
1+
package com.moplus.moplus_server.client.submit.controller;
2+
3+
import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus;
4+
import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus;
5+
import com.moplus.moplus_server.client.submit.dto.request.ChildProblemSubmitCreateRequest;
6+
import com.moplus.moplus_server.client.submit.dto.request.ChildProblemSubmitUpdateIncorrectRequest;
7+
import com.moplus.moplus_server.client.submit.dto.request.ChildProblemSubmitUpdateRequest;
8+
import com.moplus.moplus_server.client.submit.dto.request.ProblemSubmitCreateRequest;
9+
import com.moplus.moplus_server.client.submit.dto.request.ProblemSubmitUpdateRequest;
10+
import com.moplus.moplus_server.client.submit.service.ClientSubmitService;
11+
import io.swagger.v3.oas.annotations.Operation;
12+
import io.swagger.v3.oas.annotations.tags.Tag;
13+
import lombok.RequiredArgsConstructor;
14+
import org.springframework.http.ResponseEntity;
15+
import org.springframework.web.bind.annotation.PostMapping;
16+
import org.springframework.web.bind.annotation.PutMapping;
17+
import org.springframework.web.bind.annotation.RequestBody;
18+
import org.springframework.web.bind.annotation.RequestMapping;
19+
import org.springframework.web.bind.annotation.RestController;
20+
21+
@Tag(name = "클라이언트 제출", description = "클라이언트 제출 관련 API")
22+
@RestController
23+
@RequestMapping("/api/v1/client")
24+
@RequiredArgsConstructor
25+
public class ClientSubmitController {
26+
27+
private final ClientSubmitService clientSubmitService;
28+
29+
@PostMapping("problemSubmit")
30+
@Operation(summary = "문항 제출 생성", description = "문항 제출을 '진행중'으로 생성합니다.")
31+
public ResponseEntity<Void> createProblemSubmit(
32+
@RequestBody ProblemSubmitCreateRequest request
33+
) {
34+
clientSubmitService.createProblemSubmit(request);
35+
return ResponseEntity.ok(null);
36+
}
37+
38+
@PutMapping("problemSubmit")
39+
@Operation(summary = "문항 제출 업데이트", description = "제출한 답안을 바탕으로 문항 제출의 상태를 업데이트합니다.")
40+
public ResponseEntity<ProblemSubmitStatus> updateProblemSubmit(
41+
@RequestBody ProblemSubmitUpdateRequest request
42+
) {
43+
return ResponseEntity.ok(clientSubmitService.updateProblemSubmit(request));
44+
}
45+
46+
@PostMapping("childProblemSubmit")
47+
@Operation(summary = "새끼문항 제출 생성", description = "문항에 속한 새끼문항들을 '시작전'으로 생성합니다.")
48+
public ResponseEntity<Void> createProblemSubmit(
49+
@RequestBody ChildProblemSubmitCreateRequest request
50+
) {
51+
clientSubmitService.createChildProblemSubmit(request);
52+
return ResponseEntity.ok(null);
53+
}
54+
55+
@PutMapping("childProblemSubmit")
56+
@Operation(summary = "새끼문항 제출 업데이트", description = "제출한 답안을 바탕으로 문항 제출의 상태를 업데이트합니다.")
57+
public ResponseEntity<ChildProblemSubmitStatus> updateChildProblemSubmit(
58+
@RequestBody ChildProblemSubmitUpdateRequest request
59+
) {
60+
return ResponseEntity.ok(clientSubmitService.updateChildProblemSubmit(request));
61+
}
62+
63+
@PutMapping("childProblemSubmit/incorrect")
64+
@Operation(summary = "새끼문항 제출 틀림 업데이트", description = "새끼문항 제출의 상태를 틀림으로 업데이트합니다.")
65+
public ResponseEntity<Void> updateChildProblemSubmitIncorrect(
66+
@RequestBody ChildProblemSubmitUpdateIncorrectRequest request
67+
) {
68+
clientSubmitService.updateChildProblemSubmitIncorrect(request);
69+
return ResponseEntity.ok(null);
70+
}
71+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.moplus.moplus_server.client.submit.controller;
2+
3+
import com.moplus.moplus_server.client.submit.dto.response.CommentaryGetResponse;
4+
import com.moplus.moplus_server.client.submit.service.CommentaryGetService;
5+
import io.swagger.v3.oas.annotations.Operation;
6+
import io.swagger.v3.oas.annotations.tags.Tag;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.ResponseEntity;
9+
import org.springframework.web.bind.annotation.GetMapping;
10+
import org.springframework.web.bind.annotation.RequestMapping;
11+
import org.springframework.web.bind.annotation.RequestParam;
12+
import org.springframework.web.bind.annotation.RestController;
13+
14+
@Tag(name = "클라이언트 해설 조회", description = "클라이언트 해설 조회 관련 API")
15+
@RestController
16+
@RequestMapping("/api/v1/client")
17+
@RequiredArgsConstructor
18+
public class CommentaryGetController {
19+
20+
private final CommentaryGetService commentaryGetService;
21+
22+
@GetMapping("commentary")
23+
@Operation(summary = "해설 조회", description = "문항 별 해설/처방을 조회합니다.")
24+
public ResponseEntity<CommentaryGetResponse> getCommentary(
25+
@RequestParam(value = "publishId", required = false) Long publishId,
26+
@RequestParam(value = "problemId", required = false) Long problemId
27+
) {
28+
return ResponseEntity.ok(commentaryGetService.getCommentary(publishId, problemId));
29+
}
30+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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.dto.response.ChildProblemClientGetResponse;
5+
import com.moplus.moplus_server.client.submit.dto.response.ProblemClientGetResponse;
6+
import com.moplus.moplus_server.client.submit.service.ProblemsGetService;
7+
import io.swagger.v3.oas.annotations.Operation;
8+
import io.swagger.v3.oas.annotations.tags.Tag;
9+
import java.util.List;
10+
import lombok.RequiredArgsConstructor;
11+
import org.springframework.http.ResponseEntity;
12+
import org.springframework.web.bind.annotation.GetMapping;
13+
import org.springframework.web.bind.annotation.PathVariable;
14+
import org.springframework.web.bind.annotation.RequestMapping;
15+
import org.springframework.web.bind.annotation.RestController;
16+
17+
@Tag(name = "클라이언트 문제 조회", description = "클라이언트 문제 조회 관련 API")
18+
@RestController
19+
@RequestMapping("/api/v1/client")
20+
@RequiredArgsConstructor
21+
public class ProblemGetController {
22+
23+
private final ProblemsGetService problemsGetService;
24+
25+
@GetMapping("problem/all/{year}/{month}")
26+
@Operation(summary = "전체 문제 조회", description = "월별 문제들에 대한 진행도와 정보들을 조회합니다.")
27+
public ResponseEntity<List<AllProblemGetResponse>> getAllProblem(
28+
@PathVariable int year,
29+
@PathVariable int month
30+
) {
31+
return ResponseEntity.ok(problemsGetService.getAllProblem(year, month));
32+
}
33+
34+
@GetMapping("problem/{publishId}/{problemId}")
35+
@Operation(summary = "문항 조회", description = "사용자에게 보여지는 문항을 조회합니다.")
36+
public ResponseEntity<ProblemClientGetResponse> getProblem(
37+
@PathVariable Long publishId,
38+
@PathVariable Long problemId
39+
) {
40+
return ResponseEntity.ok(problemsGetService.getProblem(publishId, problemId));
41+
}
42+
43+
@GetMapping("problem/{publishId}/{problemId}/{childProblemId}")
44+
@Operation(summary = "새끼문항 조회", description = "사용자에게 보여지는 새끼문항을 조회합니다.")
45+
public ResponseEntity<ChildProblemClientGetResponse> getChildProblem(
46+
@PathVariable Long publishId,
47+
@PathVariable Long problemId,
48+
@PathVariable Long childProblemId
49+
) {
50+
return ResponseEntity.ok(problemsGetService.getChildProblem(publishId, problemId, childProblemId));
51+
}
52+
}

src/main/java/com/moplus/moplus_server/client/submit/domain/ChildProblemSubmit.java

+9
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,13 @@ public ChildProblemSubmit(Long memberId, Long publishId, Long childProblemId, Ch
3737
this.childProblemId = childProblemId;
3838
this.status = status;
3939
}
40+
41+
public void updateStatus(ChildProblemSubmitStatus status) {
42+
this.status = status;
43+
}
44+
45+
public void updateStatusIncorrect() {
46+
this.status = ChildProblemSubmitStatus.INCORRECT;
47+
48+
}
4049
}

src/main/java/com/moplus/moplus_server/client/submit/domain/ChildProblemSubmitStatus.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,16 @@
33
public enum ChildProblemSubmitStatus {
44
CORRECT,
55
INCORRECT,
6-
RETRY_CORRECT
6+
RETRY_CORRECT,
7+
NOT_STARTED;
8+
public static ChildProblemSubmitStatus determineStatus(ChildProblemSubmitStatus currentStatus, String memberAnswer, String childProblemAnswer) {
9+
boolean isCorrect = childProblemAnswer.trim().equals(memberAnswer.trim());
10+
11+
return switch (currentStatus) {
12+
case CORRECT -> isCorrect ? CORRECT : INCORRECT;
13+
case INCORRECT -> isCorrect ? RETRY_CORRECT : INCORRECT;
14+
case RETRY_CORRECT -> isCorrect ? RETRY_CORRECT : INCORRECT;
15+
default -> isCorrect ? CORRECT : INCORRECT;
16+
};
17+
}
718
}

src/main/java/com/moplus/moplus_server/client/submit/domain/ProblemSubmit.java

+4
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,8 @@ public ProblemSubmit(Long memberId, Long publishId, Long problemId, ProblemSubmi
3737
this.problemId = problemId;
3838
this.status = status;
3939
}
40+
41+
public void updateStatus(ProblemSubmitStatus status) {
42+
this.status = status;
43+
}
4044
}

src/main/java/com/moplus/moplus_server/client/submit/domain/ProblemSubmitStatus.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,15 @@ public enum ProblemSubmitStatus {
44
CORRECT,
55
INCORRECT,
66
IN_PROGRESS,
7-
RETRY_CORRECT
7+
RETRY_CORRECT;
8+
public static ProblemSubmitStatus determineStatus(ProblemSubmitStatus currentStatus, String memberAnswer, String problemAnswer) {
9+
boolean isCorrect = problemAnswer.trim().equals(memberAnswer.trim());
10+
11+
return switch (currentStatus) {
12+
case CORRECT -> isCorrect ? CORRECT : INCORRECT;
13+
case INCORRECT -> isCorrect ? RETRY_CORRECT : INCORRECT;
14+
case IN_PROGRESS -> isCorrect ? CORRECT : INCORRECT;
15+
default -> isCorrect ? RETRY_CORRECT : INCORRECT;
16+
};
17+
}
818
}

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,11 @@
1+
package com.moplus.moplus_server.client.submit.dto.request;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
5+
public record ChildProblemSubmitCreateRequest(
6+
@NotNull(message = "발행 ID는 필수입니다.")
7+
Long publishId,
8+
@NotNull(message = "문항 ID는 필수입니다.")
9+
Long problemId
10+
) {
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.moplus.moplus_server.client.submit.dto.request;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
5+
public record ChildProblemSubmitUpdateIncorrectRequest(
6+
@NotNull(message = "발행 ID는 필수입니다.")
7+
Long publishId,
8+
@NotNull(message = "새끼문항 ID는 필수입니다.")
9+
Long childProblemId
10+
) {
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.moplus.moplus_server.client.submit.dto.request;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
5+
public record ChildProblemSubmitUpdateRequest(
6+
@NotNull(message = "발행 ID는 필수입니다.")
7+
Long publishId,
8+
@NotNull(message = "새끼문항 ID는 필수입니다.")
9+
Long childProblemId,
10+
String answer
11+
) {
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.moplus.moplus_server.client.submit.dto.request;
2+
3+
import com.moplus.moplus_server.client.submit.domain.ProblemSubmit;
4+
import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus;
5+
import jakarta.validation.constraints.NotNull;
6+
7+
public record ProblemSubmitCreateRequest (
8+
@NotNull(message = "발행 ID는 필수입니다.")
9+
Long publishId,
10+
@NotNull(message = "문항 ID는 필수입니다.")
11+
Long problemId
12+
){
13+
public ProblemSubmit toEntity(Long memberId) {
14+
return ProblemSubmit.builder()
15+
.memberId(memberId)
16+
.publishId(this.publishId)
17+
.problemId(this.problemId)
18+
.status(ProblemSubmitStatus.IN_PROGRESS)
19+
.build();
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.moplus.moplus_server.client.submit.dto.request;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
5+
public record ProblemSubmitUpdateRequest(
6+
@NotNull(message = "발행 ID는 필수입니다.")
7+
Long publishId,
8+
@NotNull(message = "문항 ID는 필수입니다.")
9+
Long problemId,
10+
String answer
11+
) {
12+
}
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,23 @@
1+
package com.moplus.moplus_server.client.submit.dto.response;
2+
3+
import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus;
4+
import lombok.Builder;
5+
6+
@Builder
7+
public record ChildProblemClientGetResponse(
8+
int problemNumber,
9+
int childProblemNumber,
10+
String imageUrl,
11+
ChildProblemSubmitStatus status
12+
) {
13+
public static ChildProblemClientGetResponse of(int problemNumber, int childProblemNumber, String imageUrl,
14+
ChildProblemSubmitStatus status
15+
) {
16+
return ChildProblemClientGetResponse.builder()
17+
.problemNumber(problemNumber)
18+
.childProblemNumber(childProblemNumber)
19+
.imageUrl(imageUrl)
20+
.status(status)
21+
.build();
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.moplus.moplus_server.client.submit.dto.response;
2+
3+
import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus;
4+
import java.util.List;
5+
import lombok.Builder;
6+
7+
@Builder
8+
public record ChildProblemDetailResponse(
9+
String imageUrl,
10+
List<String> prescriptionImageUrls,
11+
ChildProblemSubmitStatus submitStatus
12+
) {
13+
public static ChildProblemDetailResponse of(String imageUrl, List<String> prescriptionImageUrls, ChildProblemSubmitStatus submitStatus) {
14+
return ChildProblemDetailResponse.builder()
15+
.imageUrl(imageUrl)
16+
.prescriptionImageUrls(prescriptionImageUrls)
17+
.submitStatus(submitStatus)
18+
.build();
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.moplus.moplus_server.client.submit.dto.response;
2+
3+
import com.moplus.moplus_server.domain.problem.domain.problem.Problem;
4+
import lombok.Builder;
5+
6+
@Builder
7+
public record CommentaryGetResponse(
8+
int problemNumber,
9+
String answer,
10+
String mainAnalysisImageUrl,
11+
String mainHandwritingExplanationImageUrl,
12+
String readingTipImageUrl,
13+
String seniorTipImageUrl,
14+
PrescriptionResponse prescription
15+
) {
16+
public static CommentaryGetResponse of(int problemNumber, Problem problem, PrescriptionResponse prescription) {
17+
return CommentaryGetResponse.builder()
18+
.problemNumber(problemNumber)
19+
.answer(problem.getAnswer())
20+
.mainAnalysisImageUrl(problem.getMainAnalysisImageUrl())
21+
.mainHandwritingExplanationImageUrl(problem.getMainHandwritingExplanationImageUrl())
22+
.readingTipImageUrl(problem.getReadingTipImageUrl())
23+
.seniorTipImageUrl(problem.getSeniorTipImageUrl())
24+
.prescription(prescription)
25+
.build();
26+
}
27+
}

0 commit comments

Comments
 (0)