Skip to content

Feature/#94 사용자 제출 관련 api 구현 #97

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 14 commits into from
Mar 23, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
Original file line number Diff line number Diff line change
@@ -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<Void> createProblemSubmit(
@RequestBody ProblemSubmitCreateRequest request
) {
clientSubmitService.createProblemSubmit(request);
return ResponseEntity.ok(null);
}

@PutMapping("problemSubmit")
@Operation(summary = "문항 제출 업데이트", description = "제출한 답안을 바탕으로 문항 제출의 상태를 업데이트합니다.")
public ResponseEntity<ProblemSubmitStatus> updateProblemSubmit(
@RequestBody ProblemSubmitUpdateRequest request
) {
return ResponseEntity.ok(clientSubmitService.updateProblemSubmit(request));
}

@PostMapping("childProblemSubmit")
@Operation(summary = "새끼문항 제출 생성", description = "문항에 속한 새끼문항들을 '시작전'으로 생성합니다.")
public ResponseEntity<Void> createProblemSubmit(
@RequestBody ChildProblemSubmitCreateRequest request
) {
clientSubmitService.createChildProblemSubmit(request);
return ResponseEntity.ok(null);
}

@PutMapping("childProblemSubmit")
@Operation(summary = "새끼문항 제출 업데이트", description = "제출한 답안을 바탕으로 문항 제출의 상태를 업데이트합니다.")
public ResponseEntity<ChildProblemSubmitStatus> updateChildProblemSubmit(
@RequestBody ChildProblemSubmitUpdateRequest request
) {
return ResponseEntity.ok(clientSubmitService.updateChildProblemSubmit(request));
}

@PutMapping("childProblemSubmit/incorrect")
@Operation(summary = "새끼문항 제출 틀림 업데이트", description = "새끼문항 제출의 상태를 틀림으로 업데이트합니다.")
public ResponseEntity<Void> updateChildProblemSubmitIncorrect(
@RequestBody ChildProblemSubmitUpdateIncorrectRequest request
) {
clientSubmitService.updateChildProblemSubmitIncorrect(request);
return ResponseEntity.ok(null);
}
}
Original file line number Diff line number Diff line change
@@ -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<CommentaryGetResponse> getCommentary(
@RequestParam(value = "publishId", required = false) Long publishId,
@RequestParam(value = "problemId", required = false) Long problemId
) {
return ResponseEntity.ok(commentaryGetService.getCommentary(publishId, problemId));
}
}
Original file line number Diff line number Diff line change
@@ -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<List<AllProblemGetResponse>> getAllProblem(
@PathVariable int year,
@PathVariable int month
) {
return ResponseEntity.ok(problemsGetService.getAllProblem(year, month));
}

@GetMapping("problem/{publishId}/{problemId}")
@Operation(summary = "문항 조회", description = "사용자에게 보여지는 문항을 조회합니다.")
public ResponseEntity<ProblemClientGetResponse> getProblem(
@PathVariable Long publishId,
@PathVariable Long problemId
) {
return ResponseEntity.ok(problemsGetService.getProblem(publishId, problemId));
}

@GetMapping("problem/{publishId}/{problemId}/{childProblemId}")
@Operation(summary = "새끼문항 조회", description = "사용자에게 보여지는 새끼문항을 조회합니다.")
public ResponseEntity<ChildProblemClientGetResponse> getChildProblem(
@PathVariable Long publishId,
@PathVariable Long problemId,
@PathVariable Long childProblemId
) {
return ResponseEntity.ok(problemsGetService.getChildProblem(publishId, problemId, childProblemId));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
}
}
Empty file.
Original file line number Diff line number Diff line change
@@ -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
) {
}
Original file line number Diff line number Diff line change
@@ -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
) {
}
Original file line number Diff line number Diff line change
@@ -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
) {
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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
) {
}
Original file line number Diff line number Diff line change
@@ -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<ProblemSubmitStatus> problemStatuses,
String mainProblemImageUrl
) {
public static AllProblemGetResponse of(Long publishId, LocalDate date, DayProgress progress,
List<ProblemSubmitStatus> problemStatuses, String mainProblemImageUrl) {
return AllProblemGetResponse.builder()
.publishId(publishId)
.date(date)
.progress(progress)
.problemStatuses(problemStatuses)
.mainProblemImageUrl(mainProblemImageUrl)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Original file line number Diff line number Diff line change
@@ -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<String> prescriptionImageUrls,
ChildProblemSubmitStatus submitStatus
) {
public static ChildProblemDetailResponse of(String imageUrl, List<String> prescriptionImageUrls, ChildProblemSubmitStatus submitStatus) {
return ChildProblemDetailResponse.builder()
.imageUrl(imageUrl)
.prescriptionImageUrls(prescriptionImageUrls)
.submitStatus(submitStatus)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -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();
}
}
Loading