diff --git a/src/main/java/com/moplus/moplus_server/client/problem/controller/ProblemGetController.java b/src/main/java/com/moplus/moplus_server/client/problem/controller/ProblemGetController.java index 6ce2e5b..43b431c 100644 --- a/src/main/java/com/moplus/moplus_server/client/problem/controller/ProblemGetController.java +++ b/src/main/java/com/moplus/moplus_server/client/problem/controller/ProblemGetController.java @@ -3,6 +3,7 @@ import com.moplus.moplus_server.client.problem.dto.response.AllProblemGetResponse; import com.moplus.moplus_server.client.problem.dto.response.ChildProblemClientGetResponse; import com.moplus.moplus_server.client.problem.dto.response.ProblemClientGetResponse; +import com.moplus.moplus_server.client.problem.dto.response.ProblemThumbnailResponse; import com.moplus.moplus_server.client.problem.dto.response.PublishClientGetResponse; import com.moplus.moplus_server.client.problem.service.ProblemsGetService; import com.moplus.moplus_server.global.annotation.AuthUser; @@ -65,4 +66,13 @@ public ResponseEntity getChildProblem( return ResponseEntity.ok( problemsGetService.getChildProblem(member.getId(), publishId, problemId, childProblemId)); } + + @GetMapping("problem/thumbnail/{publishId}/{number}") + @Operation(summary = "문항 썸네일 조회", description = "바로 풀어보기/단계별로 풀어보기 화면에서 필요한 문항을 조회합니다.") + public ResponseEntity getProblemThumbnail( + @PathVariable Long publishId, + @PathVariable int number + ) { + return ResponseEntity.ok(problemsGetService.getProblemThumbnail(publishId, number)); + } } diff --git a/src/main/java/com/moplus/moplus_server/client/problem/dto/response/ProblemThumbnailResponse.java b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/ProblemThumbnailResponse.java new file mode 100644 index 0000000..a0d311d --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/client/problem/dto/response/ProblemThumbnailResponse.java @@ -0,0 +1,21 @@ +package com.moplus.moplus_server.client.problem.dto.response; + +import com.moplus.moplus_server.domain.problem.domain.problem.Problem; +import lombok.Builder; + +@Builder +public record ProblemThumbnailResponse( + int number, + String imageUrl, + Integer recommendedMinute, + Integer recommendedSecond +) { + public static ProblemThumbnailResponse of(int number, Problem problem) { + return ProblemThumbnailResponse.builder() + .number(number) + .imageUrl(problem.getMainProblemImageUrl()) + .recommendedMinute(problem.getRecommendedTime().getMinute()) + .recommendedSecond(problem.getRecommendedTime().getSecond()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java b/src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java index 9f7f0b4..256ee55 100644 --- a/src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java +++ b/src/main/java/com/moplus/moplus_server/client/problem/service/ProblemsGetService.java @@ -6,6 +6,7 @@ import com.moplus.moplus_server.client.problem.dto.response.ChildProblemClientGetResponse; import com.moplus.moplus_server.client.problem.dto.response.ProblemClientGetResponse; import com.moplus.moplus_server.client.problem.dto.response.ProblemFeedProgressesGetResponse; +import com.moplus.moplus_server.client.problem.dto.response.ProblemThumbnailResponse; import com.moplus.moplus_server.client.problem.dto.response.PublishClientGetResponse; import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmit; import com.moplus.moplus_server.client.submit.domain.ChildProblemSubmitStatus; @@ -214,4 +215,25 @@ private ProblemFeedProgressesGetResponse getProblemStatus(Long memberId, Long pu return ProblemFeedProgressesGetResponse.of(problemStatus, childProblemStatuses, number); } + + @Transactional(readOnly = true) + public ProblemThumbnailResponse getProblemThumbnail(Long publishId, int number) { + // 발행 조회 + Publish publish = publishRepository.findByIdElseThrow(publishId); + denyAccessToFuturePublish(publish); + + // 문항 세트 조회 + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(publish.getProblemSetId()); + List problemIds = problemSet.getProblemIds(); + + int index = number - 1; + if (index < 0 || index >= problemIds.size()) { + throw new NotFoundException(ErrorCode.PROBLEM_NUMBER_NOT_FOUND); + } + + //문항 조회 + Long problemId = problemIds.get(index); + Problem problem = problemRepository.findByIdElseThrow(problemId); + return ProblemThumbnailResponse.of(number, problem); + } } 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 c005c57..d136551 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 @@ -35,6 +35,7 @@ public enum ErrorCode { INVALID_CONFIRM_PROBLEM(HttpStatus.BAD_REQUEST, "유효하지 않은 문항들 : "), INVALID_DIFFICULTY(HttpStatus.BAD_REQUEST, "난이도는 1~10 사이의 숫자여야 합니다"), PROBLEM_NOT_FOUND_IN_PROBLEM_SET(HttpStatus.NOT_FOUND, "해당 날짜에 발행된 문항세트에 존재하는 문항이 아닙니다."), + PROBLEM_NUMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "번호에 해당하는 문항을 찾을 수 없습니다."), //새끼 문항 CHILD_PROBLEM_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 새끼 문제를 찾을 수 없습니다"),