diff --git a/src/main/java/com/moplus/moplus_server/client/submit/controller/.gitkeep b/src/main/java/com/moplus/moplus_server/client/submit/controller/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/moplus/moplus_server/client/submit/controller/ClientSubmitController.java b/src/main/java/com/moplus/moplus_server/client/submit/controller/ClientSubmitController.java new file mode 100644 index 0000000..25c495c --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/controller/ClientSubmitController.java @@ -0,0 +1,71 @@ +package com.moplus.moplus_server.client.submit.controller; + +import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus; +import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus; +import com.moplus.moplus_server.client.submit.dto.request.ChildProblemSubmitCreateRequest; +import com.moplus.moplus_server.client.submit.dto.request.ChildProblemSubmitUpdateIncorrectRequest; +import com.moplus.moplus_server.client.submit.dto.request.ChildProblemSubmitUpdateRequest; +import com.moplus.moplus_server.client.submit.dto.request.ProblemSubmitCreateRequest; +import com.moplus.moplus_server.client.submit.dto.request.ProblemSubmitUpdateRequest; +import com.moplus.moplus_server.client.submit.service.ClientSubmitService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +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 ClientSubmitController { + + private final ClientSubmitService clientSubmitService; + + @PostMapping("problemSubmit") + @Operation(summary = "문항 제출 생성", description = "문항 제출을 '진행중'으로 생성합니다.") + public ResponseEntity createProblemSubmit( + @RequestBody ProblemSubmitCreateRequest request + ) { + clientSubmitService.createProblemSubmit(request); + return ResponseEntity.ok(null); + } + + @PutMapping("problemSubmit") + @Operation(summary = "문항 제출 업데이트", description = "제출한 답안을 바탕으로 문항 제출의 상태를 업데이트합니다.") + public ResponseEntity updateProblemSubmit( + @RequestBody ProblemSubmitUpdateRequest request + ) { + return ResponseEntity.ok(clientSubmitService.updateProblemSubmit(request)); + } + + @PostMapping("childProblemSubmit") + @Operation(summary = "새끼문항 제출 생성", description = "문항에 속한 새끼문항들을 '시작전'으로 생성합니다.") + public ResponseEntity createProblemSubmit( + @RequestBody ChildProblemSubmitCreateRequest request + ) { + clientSubmitService.createChildProblemSubmit(request); + return ResponseEntity.ok(null); + } + + @PutMapping("childProblemSubmit") + @Operation(summary = "새끼문항 제출 업데이트", description = "제출한 답안을 바탕으로 문항 제출의 상태를 업데이트합니다.") + public ResponseEntity updateChildProblemSubmit( + @RequestBody ChildProblemSubmitUpdateRequest request + ) { + return ResponseEntity.ok(clientSubmitService.updateChildProblemSubmit(request)); + } + + @PutMapping("childProblemSubmit/incorrect") + @Operation(summary = "새끼문항 제출 틀림 업데이트", description = "새끼문항 제출의 상태를 틀림으로 업데이트합니다.") + public ResponseEntity updateChildProblemSubmitIncorrect( + @RequestBody ChildProblemSubmitUpdateIncorrectRequest request + ) { + clientSubmitService.updateChildProblemSubmitIncorrect(request); + return ResponseEntity.ok(null); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/controller/CommentaryGetController.java b/src/main/java/com/moplus/moplus_server/client/submit/controller/CommentaryGetController.java new file mode 100644 index 0000000..b46ad78 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/controller/CommentaryGetController.java @@ -0,0 +1,30 @@ +package com.moplus.moplus_server.client.submit.controller; + +import com.moplus.moplus_server.client.submit.dto.response.CommentaryGetResponse; +import com.moplus.moplus_server.client.submit.service.CommentaryGetService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name = "클라이언트 해설 조회", description = "클라이언트 해설 조회 관련 API") +@RestController +@RequestMapping("/api/v1/client") +@RequiredArgsConstructor +public class CommentaryGetController { + + private final CommentaryGetService commentaryGetService; + + @GetMapping("commentary") + @Operation(summary = "해설 조회", description = "문항 별 해설/처방을 조회합니다.") + public ResponseEntity getCommentary( + @RequestParam(value = "publishId", required = false) Long publishId, + @RequestParam(value = "problemId", required = false) Long problemId + ) { + return ResponseEntity.ok(commentaryGetService.getCommentary(publishId, problemId)); + } +} 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 new file mode 100644 index 0000000..0f2ee30 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/controller/ProblemGetController.java @@ -0,0 +1,52 @@ +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/ChildProblemSubmit.java b/src/main/java/com/moplus/moplus_server/client/submit/domain/ChildProblemSubmit.java index c7bb92c..25a869e 100644 --- a/src/main/java/com/moplus/moplus_server/client/submit/domain/ChildProblemSubmit.java +++ b/src/main/java/com/moplus/moplus_server/client/submit/domain/ChildProblemSubmit.java @@ -37,4 +37,13 @@ public ChildProblemSubmit(Long memberId, Long publishId, Long childProblemId, Ch this.childProblemId = childProblemId; this.status = status; } + + public void updateStatus(ChildProblemSubmitStatus status) { + this.status = status; + } + + public void updateStatusIncorrect() { + this.status = ChildProblemSubmitStatus.INCORRECT; + + } } diff --git a/src/main/java/com/moplus/moplus_server/client/submit/domain/ChildProblemSubmitStatus.java b/src/main/java/com/moplus/moplus_server/client/submit/domain/ChildProblemSubmitStatus.java index 541c308..c869d59 100644 --- a/src/main/java/com/moplus/moplus_server/client/submit/domain/ChildProblemSubmitStatus.java +++ b/src/main/java/com/moplus/moplus_server/client/submit/domain/ChildProblemSubmitStatus.java @@ -3,5 +3,16 @@ public enum ChildProblemSubmitStatus { CORRECT, INCORRECT, - RETRY_CORRECT + RETRY_CORRECT, + NOT_STARTED; + public static ChildProblemSubmitStatus determineStatus(ChildProblemSubmitStatus currentStatus, String memberAnswer, String childProblemAnswer) { + boolean isCorrect = childProblemAnswer.trim().equals(memberAnswer.trim()); + + return switch (currentStatus) { + case CORRECT -> isCorrect ? CORRECT : INCORRECT; + case INCORRECT -> isCorrect ? RETRY_CORRECT : INCORRECT; + case RETRY_CORRECT -> isCorrect ? RETRY_CORRECT : INCORRECT; + default -> isCorrect ? CORRECT : INCORRECT; + }; + } } diff --git a/src/main/java/com/moplus/moplus_server/client/submit/domain/ProblemSubmit.java b/src/main/java/com/moplus/moplus_server/client/submit/domain/ProblemSubmit.java index 63ae280..02a6be9 100644 --- a/src/main/java/com/moplus/moplus_server/client/submit/domain/ProblemSubmit.java +++ b/src/main/java/com/moplus/moplus_server/client/submit/domain/ProblemSubmit.java @@ -37,4 +37,8 @@ public ProblemSubmit(Long memberId, Long publishId, Long problemId, ProblemSubmi this.problemId = problemId; this.status = status; } + + public void updateStatus(ProblemSubmitStatus status) { + this.status = status; + } } 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 e42b77d..34bb4d4 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,5 +4,15 @@ public enum ProblemSubmitStatus { CORRECT, INCORRECT, IN_PROGRESS, - RETRY_CORRECT + RETRY_CORRECT; + public static ProblemSubmitStatus determineStatus(ProblemSubmitStatus currentStatus, String memberAnswer, String problemAnswer) { + boolean isCorrect = problemAnswer.trim().equals(memberAnswer.trim()); + + return switch (currentStatus) { + case CORRECT -> isCorrect ? CORRECT : INCORRECT; + case INCORRECT -> isCorrect ? RETRY_CORRECT : INCORRECT; + case IN_PROGRESS -> isCorrect ? CORRECT : INCORRECT; + default -> isCorrect ? RETRY_CORRECT : INCORRECT; + }; + } } diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/.gitkeep b/src/main/java/com/moplus/moplus_server/client/submit/dto/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ChildProblemSubmitCreateRequest.java b/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ChildProblemSubmitCreateRequest.java new file mode 100644 index 0000000..9f42241 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ChildProblemSubmitCreateRequest.java @@ -0,0 +1,11 @@ +package com.moplus.moplus_server.client.submit.dto.request; + +import jakarta.validation.constraints.NotNull; + +public record ChildProblemSubmitCreateRequest( + @NotNull(message = "발행 ID는 필수입니다.") + Long publishId, + @NotNull(message = "문항 ID는 필수입니다.") + Long problemId +) { +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ChildProblemSubmitUpdateIncorrectRequest.java b/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ChildProblemSubmitUpdateIncorrectRequest.java new file mode 100644 index 0000000..7ad9628 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ChildProblemSubmitUpdateIncorrectRequest.java @@ -0,0 +1,11 @@ +package com.moplus.moplus_server.client.submit.dto.request; + +import jakarta.validation.constraints.NotNull; + +public record ChildProblemSubmitUpdateIncorrectRequest( + @NotNull(message = "발행 ID는 필수입니다.") + Long publishId, + @NotNull(message = "새끼문항 ID는 필수입니다.") + Long childProblemId +) { +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ChildProblemSubmitUpdateRequest.java b/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ChildProblemSubmitUpdateRequest.java new file mode 100644 index 0000000..23a452d --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ChildProblemSubmitUpdateRequest.java @@ -0,0 +1,12 @@ +package com.moplus.moplus_server.client.submit.dto.request; + +import jakarta.validation.constraints.NotNull; + +public record ChildProblemSubmitUpdateRequest( + @NotNull(message = "발행 ID는 필수입니다.") + Long publishId, + @NotNull(message = "새끼문항 ID는 필수입니다.") + Long childProblemId, + String answer +) { +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ProblemSubmitCreateRequest.java b/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ProblemSubmitCreateRequest.java new file mode 100644 index 0000000..7aec4f0 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ProblemSubmitCreateRequest.java @@ -0,0 +1,21 @@ +package com.moplus.moplus_server.client.submit.dto.request; + +import com.moplus.moplus_server.client.submit.domain.ProblemSubmit; +import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus; +import jakarta.validation.constraints.NotNull; + +public record ProblemSubmitCreateRequest ( + @NotNull(message = "발행 ID는 필수입니다.") + Long publishId, + @NotNull(message = "문항 ID는 필수입니다.") + Long problemId +){ + public ProblemSubmit toEntity(Long memberId) { + return ProblemSubmit.builder() + .memberId(memberId) + .publishId(this.publishId) + .problemId(this.problemId) + .status(ProblemSubmitStatus.IN_PROGRESS) + .build(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ProblemSubmitUpdateRequest.java b/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ProblemSubmitUpdateRequest.java new file mode 100644 index 0000000..1b52175 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/request/ProblemSubmitUpdateRequest.java @@ -0,0 +1,12 @@ +package com.moplus.moplus_server.client.submit.dto.request; + +import jakarta.validation.constraints.NotNull; + +public record ProblemSubmitUpdateRequest( + @NotNull(message = "발행 ID는 필수입니다.") + Long publishId, + @NotNull(message = "문항 ID는 필수입니다.") + Long problemId, + String answer +) { +} 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/submit/dto/response/AllProblemGetResponse.java new file mode 100644 index 0000000..91c3c6f --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/AllProblemGetResponse.java @@ -0,0 +1,26 @@ +package com.moplus.moplus_server.client.submit.dto.response; + +import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus; +import java.time.LocalDate; +import java.util.List; +import lombok.Builder; + +@Builder +public record AllProblemGetResponse( + Long publishId, + LocalDate date, + DayProgress progress, + List problemStatuses, + String mainProblemImageUrl +) { + public static AllProblemGetResponse of(Long publishId, LocalDate date, DayProgress progress, + List problemStatuses, String mainProblemImageUrl) { + return AllProblemGetResponse.builder() + .publishId(publishId) + .date(date) + .progress(progress) + .problemStatuses(problemStatuses) + .mainProblemImageUrl(mainProblemImageUrl) + .build(); + } +} 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/submit/dto/response/ChildProblemClientGetResponse.java new file mode 100644 index 0000000..f299d37 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ChildProblemClientGetResponse.java @@ -0,0 +1,23 @@ +package com.moplus.moplus_server.client.submit.dto.response; + +import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus; +import lombok.Builder; + +@Builder +public record ChildProblemClientGetResponse( + int problemNumber, + int childProblemNumber, + String imageUrl, + ChildProblemSubmitStatus status +) { + public static ChildProblemClientGetResponse of(int problemNumber, int childProblemNumber, String imageUrl, + ChildProblemSubmitStatus status + ) { + return ChildProblemClientGetResponse.builder() + .problemNumber(problemNumber) + .childProblemNumber(childProblemNumber) + .imageUrl(imageUrl) + .status(status) + .build(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ChildProblemDetailResponse.java b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ChildProblemDetailResponse.java new file mode 100644 index 0000000..8250034 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ChildProblemDetailResponse.java @@ -0,0 +1,20 @@ +package com.moplus.moplus_server.client.submit.dto.response; + +import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus; +import java.util.List; +import lombok.Builder; + +@Builder +public record ChildProblemDetailResponse( + String imageUrl, + List prescriptionImageUrls, + ChildProblemSubmitStatus submitStatus +) { + public static ChildProblemDetailResponse of(String imageUrl, List prescriptionImageUrls, ChildProblemSubmitStatus submitStatus) { + return ChildProblemDetailResponse.builder() + .imageUrl(imageUrl) + .prescriptionImageUrls(prescriptionImageUrls) + .submitStatus(submitStatus) + .build(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/CommentaryGetResponse.java b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/CommentaryGetResponse.java new file mode 100644 index 0000000..e1b7c38 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/CommentaryGetResponse.java @@ -0,0 +1,27 @@ +package com.moplus.moplus_server.client.submit.dto.response; + +import com.moplus.moplus_server.domain.problem.domain.problem.Problem; +import lombok.Builder; + +@Builder +public record CommentaryGetResponse( + int problemNumber, + String answer, + String mainAnalysisImageUrl, + String mainHandwritingExplanationImageUrl, + String readingTipImageUrl, + String seniorTipImageUrl, + PrescriptionResponse prescription +) { + public static CommentaryGetResponse of(int problemNumber, Problem problem, PrescriptionResponse prescription) { + return CommentaryGetResponse.builder() + .problemNumber(problemNumber) + .answer(problem.getAnswer()) + .mainAnalysisImageUrl(problem.getMainAnalysisImageUrl()) + .mainHandwritingExplanationImageUrl(problem.getMainHandwritingExplanationImageUrl()) + .readingTipImageUrl(problem.getReadingTipImageUrl()) + .seniorTipImageUrl(problem.getSeniorTipImageUrl()) + .prescription(prescription) + .build(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/DayProgress.java b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/DayProgress.java new file mode 100644 index 0000000..5e9251d --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/DayProgress.java @@ -0,0 +1,21 @@ +package com.moplus.moplus_server.client.submit.dto.response; + +import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus; +import java.util.List; + +public enum DayProgress { + COMPLETE, + INCOMPLETE, + IN_PROGRESS; + public static DayProgress determineDayProgress(List problemStatuses) { + if (problemStatuses.isEmpty()) { + return INCOMPLETE; + } + else if (problemStatuses.contains(ProblemSubmitStatus.IN_PROGRESS)) { + return IN_PROGRESS; + } + else{ + return COMPLETE; + } + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/PrescriptionResponse.java b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/PrescriptionResponse.java new file mode 100644 index 0000000..31e5a01 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/PrescriptionResponse.java @@ -0,0 +1,18 @@ +package com.moplus.moplus_server.client.submit.dto.response; + +import java.util.List; +import lombok.Builder; + +@Builder +public record PrescriptionResponse( + List childProblem, + ProblemDetailResponse mainProblem +) { + public static PrescriptionResponse of(List childProblem, + ProblemDetailResponse mainProblem) { + return PrescriptionResponse.builder() + .childProblem(childProblem) + .mainProblem(mainProblem) + .build(); + } +} 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/submit/dto/response/ProblemClientGetResponse.java new file mode 100644 index 0000000..5ab0f5b --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ProblemClientGetResponse.java @@ -0,0 +1,28 @@ +package com.moplus.moplus_server.client.submit.dto.response; + +import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus; +import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus; +import com.moplus.moplus_server.domain.problem.domain.problem.Problem; +import java.util.List; +import lombok.Builder; + +@Builder +public record ProblemClientGetResponse( + int number, + String imageUrl, + Integer recommendedMinute, + Integer recommendedSecond, + ProblemSubmitStatus status, + List childProblemStatuses +) { + public static ProblemClientGetResponse of(Problem problem, ProblemSubmitStatus status, List childProblemStatuses, int number) { + return ProblemClientGetResponse.builder() + .number(number) + .imageUrl(problem.getMainProblemImageUrl()) + .status(status) + .childProblemStatuses(childProblemStatuses) + .recommendedMinute(problem.getRecommendedTime().getMinute()) + .recommendedSecond(problem.getRecommendedTime().getSecond()) + .build(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ProblemDetailResponse.java b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ProblemDetailResponse.java new file mode 100644 index 0000000..2b6f047 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/dto/response/ProblemDetailResponse.java @@ -0,0 +1,21 @@ +package com.moplus.moplus_server.client.submit.dto.response; + +import com.moplus.moplus_server.client.submit.domain.ProblemSubmitStatus; +import com.moplus.moplus_server.domain.problem.domain.problem.Problem; +import java.util.List; +import lombok.Builder; + +@Builder +public record ProblemDetailResponse( + String imageUrl, + List prescriptionImageUrls, + ProblemSubmitStatus submitStatus +) { + public static ProblemDetailResponse of(Problem problem, ProblemSubmitStatus submitStatus) { + return ProblemDetailResponse.builder() + .imageUrl(problem.getMainProblemImageUrl()) + .prescriptionImageUrls(problem.getPrescriptionImageUrls()) + .submitStatus(submitStatus) + .build(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/repository/.gitkeep b/src/main/java/com/moplus/moplus_server/client/submit/repository/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/moplus/moplus_server/client/submit/repository/ChildProblemSubmitRepository.java b/src/main/java/com/moplus/moplus_server/client/submit/repository/ChildProblemSubmitRepository.java new file mode 100644 index 0000000..33a5be8 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/repository/ChildProblemSubmitRepository.java @@ -0,0 +1,20 @@ +package com.moplus.moplus_server.client.submit.repository; + +import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmit; +import com.moplus.moplus_server.global.error.exception.ErrorCode; +import com.moplus.moplus_server.global.error.exception.NotFoundException; +import java.util.List; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ChildProblemSubmitRepository extends JpaRepository { + Optional findByMemberIdAndPublishIdAndChildProblemId(Long memberId, Long publishId, Long childProblemId); + + default ChildProblemSubmit findByMemberIdAndPublishIdAndChildProblemIdElseThrow(Long memberId, Long publishId, Long childProblemId) { + return findByMemberIdAndPublishIdAndChildProblemId(memberId, publishId, childProblemId).orElseThrow( + () -> new NotFoundException(ErrorCode.CHILD_PROBLEM_SUBMIT_NOT_CONFIRMED)); + } + + List findAllByMemberIdAndPublishIdAndChildProblemIdIn(Long memberId, Long publishId, + List childProblemIds); +} 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 new file mode 100644 index 0000000..d9ff255 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/repository/ProblemSubmitRepository.java @@ -0,0 +1,19 @@ +package com.moplus.moplus_server.client.submit.repository; + +import com.moplus.moplus_server.client.submit.domain.ProblemSubmit; +import com.moplus.moplus_server.global.error.exception.ErrorCode; +import com.moplus.moplus_server.global.error.exception.NotFoundException; +import java.util.List; +import java.util.Optional; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProblemSubmitRepository extends JpaRepository { + List findByMemberIdAndPublishId(Long memberId, Long publishId); + + Optional findByMemberIdAndPublishIdAndProblemId(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)); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/service/.gitkeep b/src/main/java/com/moplus/moplus_server/client/submit/service/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/com/moplus/moplus_server/client/submit/service/ClientSubmitService.java b/src/main/java/com/moplus/moplus_server/client/submit/service/ClientSubmitService.java new file mode 100644 index 0000000..f6ebd58 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/service/ClientSubmitService.java @@ -0,0 +1,154 @@ +package com.moplus.moplus_server.client.submit.service; + + +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.request.ChildProblemSubmitCreateRequest; +import com.moplus.moplus_server.client.submit.dto.request.ChildProblemSubmitUpdateIncorrectRequest; +import com.moplus.moplus_server.client.submit.dto.request.ChildProblemSubmitUpdateRequest; +import com.moplus.moplus_server.client.submit.dto.request.ProblemSubmitCreateRequest; +import com.moplus.moplus_server.client.submit.dto.request.ProblemSubmitUpdateRequest; +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; +import com.moplus.moplus_server.domain.problem.domain.problem.Problem; +import com.moplus.moplus_server.domain.problem.repository.ChildProblemRepository; +import com.moplus.moplus_server.domain.problem.repository.ProblemRepository; +import com.moplus.moplus_server.domain.publish.repository.PublishRepository; +import java.util.List; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ClientSubmitService { + + private final ProblemSubmitRepository problemSubmitRepository; + private final ProblemRepository problemRepository; + private final ChildProblemSubmitRepository childProblemSubmitRepository; + private final PublishRepository publishRepository; + private final ChildProblemRepository childProblemRepository; + + @Transactional + public void createProblemSubmit(ProblemSubmitCreateRequest request) { + Long memberId = 1L; + + // 존재하는 발행인지 검증 + publishRepository.existsByIdElseThrow(request.publishId()); + // 존재하는 문항인지 검증 + problemRepository.existsByIdElseThrow(request.problemId()); + + // 제출이력이 없을때만 생성 + Optional existingProblemSubmit = problemSubmitRepository.findByMemberIdAndPublishIdAndProblemId(memberId, + request.publishId(), request.problemId()); + if (existingProblemSubmit.isEmpty()) { + ProblemSubmit problemSubmit = request.toEntity(memberId); + problemSubmitRepository.save(problemSubmit); + } + } + + @Transactional + public ProblemSubmitStatus updateProblemSubmit(ProblemSubmitUpdateRequest request) { + Long memberId = 1L; + + // 존재하는 발행인지 검증 + publishRepository.existsByIdElseThrow(request.publishId()); + + // 문항 조회 + Problem problem = problemRepository.findByIdElseThrow(request.problemId()); + + //문항 제출 데이터 조회 + ProblemSubmit problemSubmit = problemSubmitRepository.findByMemberIdAndPublishIdAndProblemIdElseThrow(memberId, + request.publishId(), request.problemId()); + // 제출한 답안에 대한 상태 결정 + ProblemSubmitStatus status = ProblemSubmitStatus.determineStatus(problemSubmit.getStatus(), request.answer(), + problem.getAnswer()); + + problemSubmit.updateStatus(status); + return status; + } + + @Transactional + public void createChildProblemSubmit(ChildProblemSubmitCreateRequest request) { + Long memberId = 1L; + + // 존재하는 발행인지 검증 + publishRepository.existsByIdElseThrow(request.publishId()); + // 존재하는 문항인지 검증 + problemRepository.existsByIdElseThrow(request.problemId()); + + // 문항제출 이력이 없으면 문항제출 생성 + Optional existingProblemSubmit = problemSubmitRepository.findByMemberIdAndPublishIdAndProblemId(memberId, + request.publishId(), request.problemId()); + if (existingProblemSubmit.isEmpty()) { + ProblemSubmit problemSubmit = ProblemSubmit.builder() + .memberId(memberId) + .publishId(request.publishId()) + .problemId(request.problemId()) + .status(ProblemSubmitStatus.IN_PROGRESS) + .build(); + problemSubmitRepository.save(problemSubmit); + } + + // 문항의 새끼문항 조회 + Problem problem = problemRepository.findByIdElseThrow(request.problemId()); + List childProblems = problem.getChildProblems(); + + // 제출이력이 없을떄만 생성 + for (ChildProblem childProblem : childProblems) { + Long childProblemId = childProblem.getId(); + + Optional existingChildProblemSubmit = childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemId(memberId, + request.publishId(), childProblemId); + ChildProblemSubmit childProblemSubmit = ChildProblemSubmit.builder() + .memberId(memberId) + .publishId(request.publishId()) + .childProblemId(childProblemId) + .status(ChildProblemSubmitStatus.NOT_STARTED) + .build(); + childProblemSubmitRepository.save(childProblemSubmit); + } + } + + @Transactional + public ChildProblemSubmitStatus updateChildProblemSubmit(ChildProblemSubmitUpdateRequest request) { + Long memberId = 1L; + + // 존재하는 발행인지 검증 + publishRepository.existsByIdElseThrow(request.publishId()); + + // 새끼문항 조회 + ChildProblem childProblem = childProblemRepository.findByIdElseThrow(request.childProblemId()); + + //새끼문항 제출 데이터 조회 + ChildProblemSubmit childProblemSubmit = childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemIdElseThrow(memberId, + request.publishId(), request.childProblemId()); + // 제출한 답안에 대한 상태 결정 + ChildProblemSubmitStatus status = ChildProblemSubmitStatus.determineStatus(childProblemSubmit.getStatus(), request.answer(), + childProblem.getAnswer()); + + childProblemSubmit.updateStatus(status); + return status; + } + + @Transactional + public void updateChildProblemSubmitIncorrect(ChildProblemSubmitUpdateIncorrectRequest request) { + Long memberId = 1L; + + // 존재하는 발행인지 검증 + publishRepository.existsByIdElseThrow(request.publishId()); + + // 새끼문항 조회 + ChildProblem childProblem = childProblemRepository.findByIdElseThrow(request.childProblemId()); + + //새끼문항 제출 데이터 조회 + ChildProblemSubmit childProblemSubmit = childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemIdElseThrow(memberId, + request.publishId(), request.childProblemId()); + // 틀림 처리 + childProblemSubmit.updateStatusIncorrect(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/service/CommentaryGetService.java b/src/main/java/com/moplus/moplus_server/client/submit/service/CommentaryGetService.java new file mode 100644 index 0000000..cbbb914 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/service/CommentaryGetService.java @@ -0,0 +1,86 @@ +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.dto.response.ChildProblemDetailResponse; +import com.moplus.moplus_server.client.submit.dto.response.CommentaryGetResponse; +import com.moplus.moplus_server.client.submit.dto.response.PrescriptionResponse; +import com.moplus.moplus_server.client.submit.dto.response.ProblemDetailResponse; +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.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.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 com.moplus.moplus_server.global.error.exception.NotFoundException; +import java.time.LocalDate; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class CommentaryGetService { + + private final PublishRepository publishRepository; + private final ProblemSubmitRepository problemSubmitRepository; + private final ProblemRepository problemRepository; + private final ProblemSetRepository problemSetRepository; + private final ChildProblemSubmitRepository childProblemSubmitRepository; + + @Transactional(readOnly = true) + public CommentaryGetResponse getCommentary(Long publishId, Long problemId) { + Long memberId = 1L; + + // 발행 조회 + Publish publish = publishRepository.findByIdElseThrow(publishId); + denyAccessToFuturePublish(publish); + + // 문항 제출 조회 + ProblemSubmit problemSubmit = problemSubmitRepository.findByMemberIdAndPublishIdAndProblemIdElseThrow(memberId, + publishId, problemId); + + // 문항 해설 생성 + Problem problem = problemRepository.findByIdElseThrow(problemId); + ProblemDetailResponse mainProblem = ProblemDetailResponse.of( + problem, + problemSubmit.getStatus() + ); + + // 새끼문항 해설 생성 + List childProblem = problem.getChildProblems().stream() + .map(cp -> ChildProblemDetailResponse.of( + cp.getImageUrl(), + cp.getPrescriptionImageUrls(), + childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemIdElseThrow(memberId, publishId, + cp.getId()).getStatus() + )).toList(); + + // 처방 정보 생성 + PrescriptionResponse prescription = PrescriptionResponse.of(childProblem, mainProblem); + + // 문항 번호 추출 + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(publish.getProblemSetId()); + List problemIds = problemSet.getProblemIds(); + int number = problemIds.indexOf(problemId); + if (number == -1) { + throw new NotFoundException(ErrorCode.PROBLEM_NOT_FOUND_IN_PROBLEM_SET); + } + + return CommentaryGetResponse.of( + number + 1, + problem, + prescription + ); + } + + private void denyAccessToFuturePublish(Publish publish){ + if (publish.getPublishedDate().isAfter(LocalDate.now())) { + throw new InvalidValueException(ErrorCode.FUTURE_PUBLISH_NOT_ACCESSIBLE); + } + } +} diff --git a/src/main/java/com/moplus/moplus_server/client/submit/service/ProblemsGetService.java b/src/main/java/com/moplus/moplus_server/client/submit/service/ProblemsGetService.java new file mode 100644 index 0000000..ecf174e --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/submit/service/ProblemsGetService.java @@ -0,0 +1,166 @@ +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.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; +import com.moplus.moplus_server.domain.problem.domain.problem.Problem; +import com.moplus.moplus_server.domain.problem.repository.ChildProblemRepository; +import com.moplus.moplus_server.domain.problem.repository.ProblemRepository; +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 com.moplus.moplus_server.global.error.exception.NotFoundException; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ProblemsGetService { + + 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; + + if (month < MIN_MONTH || month > MAX_MONTH) { + throw new InvalidValueException(ErrorCode.INVALID_MONTH_ERROR); + } + LocalDate startDate = LocalDate.of(year, month, 1); + LocalDate endDate = startDate.withDayOfMonth(startDate.lengthOfMonth()); + + // 해당 월 모든 Publish 조회 + // 오늘 이후 발행이 있다면 필터링 + List publishes = publishRepository.findByPublishedDateBetween(startDate, endDate).stream() + .filter(publish -> !publish.getPublishedDate().isAfter(LocalDate.now())) + .toList(); + + List result = new ArrayList<>(); + + for (Publish publish : publishes) { + Long publishId = publish.getId(); + LocalDate date = publish.getPublishedDate(); + + // 날짜별 사용자 제출 정보 조회 + List submissions = problemSubmitRepository.findByMemberIdAndPublishId(memberId, publishId); + List problemStatuses = submissions.stream() + .map(ProblemSubmit::getStatus ) + .toList(); + + // 사용자 제출 정보 바탕으로 진행도 결정 + DayProgress progress = DayProgress.determineDayProgress(problemStatuses); + String mainProblemImageUrl = getMainProblemImageUrl(publish.getProblemSetId()); + + result.add(AllProblemGetResponse.of(publishId, date, progress, problemStatuses, mainProblemImageUrl)); + } + return result; + } + + private String getMainProblemImageUrl(Long problemSetId) { + return problemSetRepository.findById(problemSetId) + .flatMap(problemSet -> problemSet.getProblemIds().stream().findFirst()) + .flatMap(problemRepository::findById) + .map(Problem::getMainProblemImageUrl) + .orElse(null); + } + + @Transactional(readOnly = true) + public ProblemClientGetResponse getProblem(Long publishId, Long problemId) { + Long memberId = 1L; + + // 발행 조회 + Publish publish = publishRepository.findByIdElseThrow(publishId); + denyAccessToFuturePublish(publish); + + // 문항 번호 추출 + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(publish.getProblemSetId()); + List problemIds = problemSet.getProblemIds(); + int number = problemIds.indexOf(problemId); + if (number == -1) { + throw new NotFoundException(ErrorCode.PROBLEM_NOT_FOUND_IN_PROBLEM_SET); + } + + // 문항조회 + Problem problem = problemRepository.findByIdElseThrow(problemId); + + // 문항 제출 조회 + ProblemSubmit problemSubmit = problemSubmitRepository.findByMemberIdAndPublishIdAndProblemIdElseThrow(memberId, + publishId, problemId); + + // 새끼 문항 제출 상태 조회 + List childProblemIds = problem.getChildProblems().stream() + .map(ChildProblem::getId) + .toList(); + + List childProblemStatuses = childProblemSubmitRepository.findAllByMemberIdAndPublishIdAndChildProblemIdIn( + memberId, publishId, childProblemIds).stream() + .map(ChildProblemSubmit::getStatus) + .toList(); + + return ProblemClientGetResponse.of(problem, problemSubmit.getStatus(), childProblemStatuses, number + 1); + } + + @Transactional(readOnly = true) + public ChildProblemClientGetResponse getChildProblem(Long publishId, Long problemId, Long childProblemId) { + Long memberId = 1L; + + // 발행 조회 + Publish publish = publishRepository.findByIdElseThrow(publishId); + denyAccessToFuturePublish(publish); + + // 문항/새끼문항 조회 + Problem problem = problemRepository.findByIdElseThrow(problemId); + ChildProblem childProblem = childProblemRepository.findByIdElseThrow(childProblemId); + + // 새끼문항 제출 조회 + ChildProblemSubmit childProblemSubmit = childProblemSubmitRepository.findByMemberIdAndPublishIdAndChildProblemIdElseThrow( + memberId, publishId, childProblemId); + + int childProblemNumber = 0; + for (int i = 0; i < problem.getChildProblems().size(); i++) { + if (problem.getChildProblems().get(i).getId().equals(childProblemId)) { + childProblemNumber = i + 1; + break; + } + } + + // 문항 번호 추출 + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(publish.getProblemSetId()); + List problemIds = problemSet.getProblemIds(); + int problemNumber = problemIds.indexOf(problemId); + if (problemNumber == -1) { + throw new NotFoundException(ErrorCode.PROBLEM_NOT_FOUND_IN_PROBLEM_SET); + } + + return ChildProblemClientGetResponse.of(problemNumber + 1, childProblemNumber + 1, childProblem.getImageUrl(), childProblemSubmit.getStatus()); + } + + private void denyAccessToFuturePublish(Publish publish){ + if (publish.getPublishedDate().isAfter(LocalDate.now())) { + throw new InvalidValueException(ErrorCode.FUTURE_PUBLISH_NOT_ACCESSIBLE); + } + } +} diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/repository/ProblemRepository.java b/src/main/java/com/moplus/moplus_server/domain/problem/repository/ProblemRepository.java index 4529f68..3779f0f 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/repository/ProblemRepository.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/repository/ProblemRepository.java @@ -25,4 +25,5 @@ default void existsByProblemAdminIdElseThrow(ProblemCustomId problemCustomId) { default Problem findByIdElseThrow(Long id) { return findById(id).orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_NOT_FOUND)); } + } diff --git a/src/main/java/com/moplus/moplus_server/domain/publish/repository/PublishRepository.java b/src/main/java/com/moplus/moplus_server/domain/publish/repository/PublishRepository.java index d7422a1..37dcce3 100644 --- a/src/main/java/com/moplus/moplus_server/domain/publish/repository/PublishRepository.java +++ b/src/main/java/com/moplus/moplus_server/domain/publish/repository/PublishRepository.java @@ -15,4 +15,10 @@ default Publish findByIdElseThrow(Long publishId) { } List findByProblemSetId(Long problemSetId); + + default void existsByIdElseThrow(Long id) { + if (!existsById(id)) { + throw new NotFoundException(ErrorCode.PUBLISH_NOT_FOUND); + } + } } diff --git a/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java b/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java index 52a7fa0..9f7f67a 100644 --- a/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java +++ b/src/main/java/com/moplus/moplus_server/global/error/exception/ErrorCode.java @@ -34,6 +34,7 @@ public enum ErrorCode { INVALID_SHORT_NUMBER_ANSWER(HttpStatus.BAD_REQUEST, "주관식 문항의 정답은 0~999 사이의 숫자여야 합니다"), INVALID_CONFIRM_PROBLEM(HttpStatus.BAD_REQUEST, "유효하지 않은 문항들 : "), INVALID_DIFFICULTY(HttpStatus.BAD_REQUEST, "난이도는 1~10 사이의 숫자여야 합니다"), + PROBLEM_NOT_FOUND_IN_PROBLEM_SET(HttpStatus.NOT_FOUND, "해당 날짜에 발행된 문항세트에 존재하는 문항이 아닙니다."), //새끼 문항 CHILD_PROBLEM_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 새끼 문제를 찾을 수 없습니다"), @@ -76,6 +77,13 @@ public enum ErrorCode { ALREADY_PUBLISHED_ERROR(HttpStatus.BAD_REQUEST, "이미 발행된 문항세트는 컨펌해제할 수 없습니다."), PROBLEM_SET_DELETED(HttpStatus.BAD_REQUEST, "삭제된 문항세트는 발행할 수 없습니다"), PROBLEM_SET_NOT_CONFIRMED(HttpStatus.BAD_REQUEST, "컨펌되지 않은 문항세트는 발행할 수 없습니다"), + FUTURE_PUBLISH_NOT_ACCESSIBLE(HttpStatus.BAD_REQUEST, "오늘 이후의 발행을 조회할 수 없습니다."), + + // 문항 제출 + PROBLEM_SUBMIT_NOT_CONFIRMED(HttpStatus.NOT_FOUND, "문항 제출 정보를 찾을 수 없습니다."), + + // 새끼문항 제출 + CHILD_PROBLEM_SUBMIT_NOT_CONFIRMED(HttpStatus.NOT_FOUND, "새끼문항 제출 정보를 찾을 수 없습니다."), ;