diff --git a/src/main/generated/com/moplus/moplus_server/domain/problem/domain/childProblem/QChildProblem.java b/src/main/generated/com/moplus/moplus_server/domain/problem/domain/childProblem/QChildProblem.java index 193076d..94253bb 100644 --- a/src/main/generated/com/moplus/moplus_server/domain/problem/domain/childProblem/QChildProblem.java +++ b/src/main/generated/com/moplus/moplus_server/domain/problem/domain/childProblem/QChildProblem.java @@ -37,6 +37,8 @@ public class QChildProblem extends EntityPathBase { public final StringPath imageUrl = createString("imageUrl"); + public final ListPath prescriptionImageUrls = this.createList("prescriptionImageUrls", String.class, StringPath.class, PathInits.DIRECT2); + //inherited public final DateTimePath updatedDate = _super.updatedDate; diff --git a/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapperImpl.java b/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapperImpl.java index e682008..f872cbc 100644 --- a/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapperImpl.java +++ b/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapperImpl.java @@ -1,40 +1,22 @@ package com.moplus.moplus_server.domain.problem.service.mapper; import com.moplus.moplus_server.domain.problem.domain.childProblem.ChildProblem; -import com.moplus.moplus_server.domain.problem.dto.request.ChildProblemPostRequest; import com.moplus.moplus_server.domain.problem.dto.request.ChildProblemUpdateRequest; +import java.util.ArrayList; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; import javax.annotation.processing.Generated; import org.springframework.stereotype.Component; @Generated( value = "org.mapstruct.ap.MappingProcessor", - date = "2025-02-21T03:13:14+0900", + date = "2025-03-03T17:28:35+0900", comments = "version: 1.6.3, compiler: javac, environment: Java 17.0.10 (JetBrains s.r.o.)" ) @Component public class ChildProblemMapperImpl implements ChildProblemMapper { - @Override - public ChildProblem from(ChildProblemPostRequest request) { - if ( request == null ) { - return null; - } - - ChildProblem.ChildProblemBuilder childProblem = ChildProblem.builder(); - - childProblem.imageUrl( request.imageUrl() ); - childProblem.answerType( request.answerType() ); - childProblem.answer( request.answer() ); - Set set = request.conceptTagIds(); - if ( set != null ) { - childProblem.conceptTagIds( new LinkedHashSet( set ) ); - } - - return childProblem.build(); - } - @Override public ChildProblem from(ChildProblemUpdateRequest request) { if ( request == null ) { @@ -44,6 +26,10 @@ public ChildProblem from(ChildProblemUpdateRequest request) { ChildProblem.ChildProblemBuilder childProblem = ChildProblem.builder(); childProblem.id( request.childProblemId() ); + List list = request.prescriptionImageUrls(); + if ( list != null ) { + childProblem.prescriptionImageUrls( new ArrayList( list ) ); + } childProblem.imageUrl( request.imageUrl() ); childProblem.answerType( request.answerType() ); childProblem.answer( request.answer() ); diff --git a/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapperImpl.java b/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapperImpl.java index c228ba7..e2bc255 100644 --- a/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapperImpl.java +++ b/src/main/generated/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapperImpl.java @@ -15,7 +15,7 @@ @Generated( value = "org.mapstruct.ap.MappingProcessor", - date = "2025-02-24T23:05:21+0900", + date = "2025-03-03T17:28:35+0900", comments = "version: 1.6.3, compiler: javac, environment: Java 17.0.10 (JetBrains s.r.o.)" ) @Component diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/controller/ProblemController.java b/src/main/java/com/moplus/moplus_server/domain/problem/controller/ProblemController.java index 9db45a7..bf72756 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/controller/ProblemController.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/controller/ProblemController.java @@ -63,7 +63,7 @@ public ResponseEntity updateProblem( @DeleteMapping("/{id}") @Operation(summary = "문항 삭제") - public ResponseEntity updateProblem( + public ResponseEntity deleteProblem( @PathVariable("id") Long id ) { problemDeleteService.deleteProblem(id); diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/domain/childProblem/ChildProblem.java b/src/main/java/com/moplus/moplus_server/domain/problem/domain/childProblem/ChildProblem.java index 08c83c5..52bda4f 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/domain/childProblem/ChildProblem.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/domain/childProblem/ChildProblem.java @@ -2,11 +2,13 @@ import com.moplus.moplus_server.domain.problem.domain.Answer; import com.moplus.moplus_server.domain.problem.domain.problem.AnswerType; +import com.moplus.moplus_server.domain.problem.repository.converter.StringListConverter; import com.moplus.moplus_server.global.common.BaseEntity; import com.moplus.moplus_server.global.error.exception.ErrorCode; import com.moplus.moplus_server.global.error.exception.InvalidValueException; import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; +import jakarta.persistence.Convert; import jakarta.persistence.ElementCollection; import jakarta.persistence.Embedded; import jakarta.persistence.Entity; @@ -16,6 +18,7 @@ import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; +import java.util.List; import java.util.Set; import lombok.AccessLevel; import lombok.Builder; @@ -35,6 +38,9 @@ public class ChildProblem extends BaseEntity { @CollectionTable(name = "child_problem_concept", joinColumns = @JoinColumn(name = "child_problem_id")) @Column(name = "concept_tag_id") Set conceptTagIds; + @Convert(converter = StringListConverter.class) + @Column(columnDefinition = "TEXT") + List prescriptionImageUrls; private String imageUrl; @Embedded private Answer answer; @@ -42,13 +48,15 @@ public class ChildProblem extends BaseEntity { private AnswerType answerType; @Builder - public ChildProblem(Long id, String imageUrl, AnswerType answerType, String answer, Set conceptTagIds) { + public ChildProblem(Long id, String imageUrl, AnswerType answerType, String answer, Set conceptTagIds, + List prescriptionImageUrls) { this.id = id; validateAnswerByType(answer, answerType); this.imageUrl = imageUrl; this.answerType = answerType; this.answer = new Answer(answer, answerType); this.conceptTagIds = conceptTagIds; + this.prescriptionImageUrls = prescriptionImageUrls; } public static ChildProblem createEmptyChildProblem() { @@ -57,6 +65,7 @@ public static ChildProblem createEmptyChildProblem() { .answerType(AnswerType.SHORT_ANSWER) .answer("") .conceptTagIds(Set.of()) + .prescriptionImageUrls(List.of()) .build(); } @@ -76,6 +85,7 @@ public void update(ChildProblem input) { this.answerType = input.answerType; this.answer = input.answer; this.conceptTagIds = input.conceptTagIds; + this.prescriptionImageUrls = input.prescriptionImageUrls; } public String getAnswer() { diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/Problem.java b/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/Problem.java index b39cf66..5185f43 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/Problem.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/Problem.java @@ -194,4 +194,8 @@ public String getProblemCustomId() { return problemCustomId.getId(); } + public Integer getNumber() { + return number != null ? number : null; + } + } \ No newline at end of file diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ChildProblemPostRequest.java b/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ChildProblemPostRequest.java index 0877351..7df4684 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ChildProblemPostRequest.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ChildProblemPostRequest.java @@ -10,6 +10,7 @@ public record ChildProblemPostRequest( String answer, @NotNull(message = "컬렉션 값은 필수입니다.") Set conceptTagIds, + int sequence ) { } diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ChildProblemUpdateRequest.java b/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ChildProblemUpdateRequest.java index ec78dd1..7ae28f0 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ChildProblemUpdateRequest.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ChildProblemUpdateRequest.java @@ -2,6 +2,7 @@ import com.moplus.moplus_server.domain.problem.domain.problem.AnswerType; import jakarta.validation.constraints.NotNull; +import java.util.List; import java.util.Set; public record ChildProblemUpdateRequest( @@ -10,6 +11,8 @@ public record ChildProblemUpdateRequest( AnswerType answerType, String answer, @NotNull(message = "컬렉션 값은 필수입니다.") - Set conceptTagIds + Set conceptTagIds, + @NotNull(message = "컬렉션 값은 필수입니다.") + List prescriptionImageUrls ) { } diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/dto/response/ChildProblemGetResponse.java b/src/main/java/com/moplus/moplus_server/domain/problem/dto/response/ChildProblemGetResponse.java index b5fc52e..c2ad8f4 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/dto/response/ChildProblemGetResponse.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/dto/response/ChildProblemGetResponse.java @@ -3,6 +3,7 @@ import com.moplus.moplus_server.domain.problem.domain.childProblem.ChildProblem; import com.moplus.moplus_server.domain.problem.domain.problem.AnswerType; import jakarta.validation.constraints.NotNull; +import java.util.List; import java.util.Set; import lombok.Builder; @@ -14,7 +15,9 @@ public record ChildProblemGetResponse( AnswerType answerType, String answer, @NotNull(message = "컬렉션 값은 필수입니다.") - Set conceptTagIds + Set conceptTagIds, + @NotNull(message = "컬렉션 값은 필수입니다.") + List prescriptionImageUrls ) { public static ChildProblemGetResponse of(ChildProblem childProblem) { @@ -24,6 +27,7 @@ public static ChildProblemGetResponse of(ChildProblem childProblem) { .answerType(childProblem.getAnswerType()) .answer(childProblem.getAnswer()) .conceptTagIds(childProblem.getConceptTagIds()) + .prescriptionImageUrls(childProblem.getPrescriptionImageUrls()) .build(); } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/dto/response/ProblemGetResponse.java b/src/main/java/com/moplus/moplus_server/domain/problem/dto/response/ProblemGetResponse.java index 06bb301..805d018 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/dto/response/ProblemGetResponse.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/dto/response/ProblemGetResponse.java @@ -18,7 +18,7 @@ public record ProblemGetResponse( Set conceptTagIds, boolean isConfirmed, Long practiceTestId, - int number, + Integer number, Integer difficulty, String title, String answer, diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/service/ChildProblemService.java b/src/main/java/com/moplus/moplus_server/domain/problem/service/ChildProblemService.java index bdc1f6a..7cf4753 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/service/ChildProblemService.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/service/ChildProblemService.java @@ -2,7 +2,6 @@ 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.global.error.exception.ErrorCode; import com.moplus.moplus_server.global.error.exception.InvalidValueException; @@ -15,7 +14,6 @@ public class ChildProblemService { private final ProblemRepository problemRepository; - private final ChildProblemRepository childProblemRepository; @Transactional public Long createChildProblem(Long problemId) { diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemUpdateService.java b/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemUpdateService.java index 423fd3b..9fb950b 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemUpdateService.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemUpdateService.java @@ -6,6 +6,7 @@ import com.moplus.moplus_server.domain.problem.domain.problem.Problem; import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminIdService; import com.moplus.moplus_server.domain.problem.domain.problem.ProblemCustomId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemType; import com.moplus.moplus_server.domain.problem.dto.request.ProblemUpdateRequest; import com.moplus.moplus_server.domain.problem.dto.response.ProblemGetResponse; import com.moplus.moplus_server.domain.problem.repository.PracticeTestTagRepository; @@ -30,12 +31,17 @@ public class ProblemUpdateService { @Transactional public ProblemGetResponse updateProblem(Long problemId, ProblemUpdateRequest request) { - PracticeTestTag practiceTestTag = practiceTestRepository.findByIdElseThrow(request.practiceTestId()); conceptTagRepository.existsByIdElseThrow(request.conceptTagIds()); Problem problem = problemRepository.findByIdElseThrow(problemId); - - ProblemCustomId problemCustomId = problemAdminIdService.nextId(request.number(), practiceTestTag, - request.problemType()); + PracticeTestTag practiceTestTag = null; + ProblemCustomId problemCustomId = null; + if (request.problemType() != ProblemType.CREATION_PROBLEM) { + practiceTestTag = practiceTestRepository.findByIdElseThrow(request.practiceTestId()); + problemCustomId = problemAdminIdService.nextId(request.number(), practiceTestTag, + request.problemType()); + } else { + problemCustomId = problemAdminIdService.nextId(request.problemType()); + } Problem inputProblem = problemMapper.from(request, problemCustomId, practiceTestTag); problem.update(inputProblem); diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapper.java b/src/main/java/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapper.java index b48abe5..836f761 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapper.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/service/mapper/ChildProblemMapper.java @@ -1,7 +1,6 @@ package com.moplus.moplus_server.domain.problem.service.mapper; import com.moplus.moplus_server.domain.problem.domain.childProblem.ChildProblem; -import com.moplus.moplus_server.domain.problem.dto.request.ChildProblemPostRequest; import com.moplus.moplus_server.domain.problem.dto.request.ChildProblemUpdateRequest; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -9,8 +8,7 @@ @Mapper(componentModel = "spring") public interface ChildProblemMapper { - ChildProblem from(ChildProblemPostRequest request); - @Mapping(target = "id", source = "childProblemId") + @Mapping(target = "prescriptionImageUrls", source = "prescriptionImageUrls") ChildProblem from(ChildProblemUpdateRequest request); } diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/dto/response/ProblemSummaryResponse.java b/src/main/java/com/moplus/moplus_server/domain/problemset/dto/response/ProblemSummaryResponse.java index 427ec6c..c366b6a 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/dto/response/ProblemSummaryResponse.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/dto/response/ProblemSummaryResponse.java @@ -2,7 +2,7 @@ import com.moplus.moplus_server.domain.problem.domain.problem.Problem; import jakarta.validation.constraints.NotNull; -import java.util.List; +import java.util.Set; import lombok.Builder; @Builder @@ -15,9 +15,9 @@ public record ProblemSummaryResponse( String memo, String mainProblemImageUrl, @NotNull(message = "컬렉션 값은 필수입니다.") - List tagNames + Set tagNames ) { - public static ProblemSummaryResponse of(Problem problem, List tagNames) { + public static ProblemSummaryResponse of(Problem problem, Set tagNames) { return ProblemSummaryResponse.builder() .problemId(problem.getId()) diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetGetService.java b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetGetService.java index 441e9d8..aea8091 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetGetService.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetGetService.java @@ -3,7 +3,6 @@ import com.moplus.moplus_server.domain.concept.domain.ConceptTag; import com.moplus.moplus_server.domain.concept.repository.ConceptTagRepository; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.repository.PracticeTestTagRepository; 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.dto.response.ProblemSetGetResponse; @@ -15,7 +14,9 @@ import com.moplus.moplus_server.global.error.exception.ErrorCode; import java.time.LocalDate; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -42,10 +43,14 @@ public ProblemSetGetResponse getProblemSet(Long problemSetId) { List problemSummaries = new ArrayList<>(); for (Long problemId : problemSet.getProblemIds()) { Problem problem = problemRepository.findByIdElseThrow(problemId); - List tagNames = conceptTagRepository.findAllByIdsElseThrow(problem.getConceptTagIds()) - .stream() - .map(ConceptTag::getName) - .toList(); + Set tagNames = new HashSet<>( + conceptTagRepository.findAllByIdsElseThrow(problem.getConceptTagIds()) + .stream() + .map(ConceptTag::getName) + .toList()); + problem.getChildProblems().stream() + .map(childProblem -> conceptTagRepository.findAllByIdsElseThrow(childProblem.getConceptTagIds())) + .forEach(conceptTags -> tagNames.addAll(conceptTags.stream().map(ConceptTag::getName).toList())); problemSummaries.add(ProblemSummaryResponse.of(problem, tagNames)); } return ProblemSetGetResponse.of(problemSet, publishedDates, problemSummaries); diff --git a/src/test/java/com/moplus/moplus_server/domain/problem/service/ProblemUpdateServiceTest.java b/src/test/java/com/moplus/moplus_server/domain/problem/service/ProblemUpdateServiceTest.java index 6a2fa18..e27e494 100644 --- a/src/test/java/com/moplus/moplus_server/domain/problem/service/ProblemUpdateServiceTest.java +++ b/src/test/java/com/moplus/moplus_server/domain/problem/service/ProblemUpdateServiceTest.java @@ -49,7 +49,8 @@ void setUp() { "updatedChild1.png", AnswerType.MULTIPLE_CHOICE, "2", - Set.of(2L, 3L) + Set.of(2L, 3L), + List.of("prescription1.png", "prescription2.png") ); ChildProblemUpdateRequest updateChildProblem2 = new ChildProblemUpdateRequest( @@ -57,7 +58,8 @@ void setUp() { "updatedChild2.png", AnswerType.SHORT_ANSWER, "23", - Set.of(3L, 4L) + Set.of(3L, 4L), + List.of("prescription3.png") ); problemUpdateRequest = new ProblemUpdateRequest( @@ -128,6 +130,8 @@ class 문제_업데이트_정상_동작 { assertThat(updatedChild.getAnswerType()).isEqualTo(AnswerType.MULTIPLE_CHOICE); assertThat(updatedChild.getAnswer()).isEqualTo("2"); assertThat(updatedChild.getConceptTagIds()).containsExactlyInAnyOrderElementsOf(Set.of(2L, 3L)); + assertThat(updatedChild.getPrescriptionImageUrls()) + .containsExactly("prescription1.png", "prescription2.png"); // 두 번째 자식 문제 검증 (새로 추가된 문제) ChildProblem newChild = childProblems.get(1); @@ -135,6 +139,7 @@ class 문제_업데이트_정상_동작 { assertThat(newChild.getAnswerType()).isEqualTo(AnswerType.SHORT_ANSWER); assertThat(newChild.getAnswer()).isEqualTo("23"); assertThat(newChild.getConceptTagIds()).containsExactlyInAnyOrderElementsOf(Set.of(3L, 4L)); + assertThat(newChild.getPrescriptionImageUrls()).containsExactly("prescription3.png"); // 추가된 검증 assertThat(response.recommendedMinute()).isEqualTo(30);