From 79b5b53f0f34aeb0c81f26ed1be880c22adfffc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B8=EC=A4=80?= <74056843+sejoon00@users.noreply.github.com> Date: Wed, 12 Feb 2025 03:20:52 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[feat/#34]=20=EB=AC=B8=ED=95=AD=20=EC=B2=AB?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=20api=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/childProblem/QChildProblem.java | 4 +- .../problem/domain/problem/QProblem.java | 18 +-- .../domain/problem/QProblemAdminId.java | 37 ++++++ .../problem/domain/problem/QProblemId.java | 37 ------ .../mapper/ChildProblemMapperImpl.java | 6 +- .../service/mapper/ProblemMapperImpl.java | 41 +++---- .../domain/problemset/domain/QProblemSet.java | 2 +- .../auth/controller/AuthController.java | 23 +--- .../auth/dto/response/TokenResponse.java | 7 ++ .../problem/controller/ProblemController.java | 2 +- .../domain/problem/domain/Answer.java | 12 +- .../domain/childProblem/ChildProblem.java | 18 +-- .../problem/domain/practiceTest/Subject.java | 2 +- .../problem/domain/problem/AnswerType.java | 37 ++++++ .../problem/domain/problem/Problem.java | 73 ++++++----- .../{ProblemId.java => ProblemAdminId.java} | 6 +- .../domain/problem/ProblemIdService.java | 25 ++-- .../problem/domain/problem/ProblemType.java | 33 +---- .../dto/request/ChildProblemPostRequest.java | 4 +- .../request/ChildProblemUpdateRequest.java | 4 +- .../dto/request/ProblemPostRequest.java | 30 ++--- .../dto/request/ProblemUpdateRequest.java | 2 +- .../dto/response/ChildProblemGetResponse.java | 6 +- .../dto/response/ProblemGetResponse.java | 8 +- .../problem/repository/ProblemRepository.java | 20 +--- .../problem/service/ProblemDeleteService.java | 6 +- .../problem/service/ProblemGetService.java | 4 +- .../problem/service/ProblemSaveService.java | 24 +--- .../problem/service/ProblemUpdateService.java | 6 +- .../problem/service/mapper/ProblemMapper.java | 10 +- .../domain/problemset/domain/ProblemSet.java | 22 ++-- .../dto/request/ProblemSetPostRequest.java | 6 +- .../dto/response/ProblemSummaryResponse.java | 4 +- .../ProblemSetSearchRepositoryCustom.java | 15 ++- .../service/ProblemSetGetService.java | 6 +- .../service/ProblemSetSaveService.java | 10 +- .../service/ProblemSetUpdateService.java | 20 ++-- .../resources/templates/answerInputForm.html | 113 ++++++++++-------- .../resources/templates/imageUploadPage.html | 12 +- .../resources/templates/practiceTestList.html | 8 +- .../resources/templates/testInputForm.html | 56 +++++---- ...st.java => ProblemAdminIdServiceTest.java} | 14 +-- .../service/ProblemSaveServiceTest.java | 28 ++--- .../service/ProblemUpdateServiceTest.java | 16 +-- .../problemset/ProblemSetServiceTest.java | 26 ++-- .../service/ProblemSetGetServiceTest.java | 10 +- 46 files changed, 445 insertions(+), 428 deletions(-) create mode 100644 src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblemAdminId.java delete mode 100644 src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblemId.java create mode 100644 src/main/java/com/moplus/moplus_server/domain/auth/dto/response/TokenResponse.java create mode 100644 src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/AnswerType.java rename src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/{ProblemId.java => ProblemAdminId.java} (70%) rename src/test/java/com/moplus/moplus_server/domain/problem/domain/problem/{ProblemIdServiceTest.java => ProblemAdminIdServiceTest.java} (84%) 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 8dad7ae..b22ac5b 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 @@ -26,6 +26,8 @@ public class QChildProblem extends EntityPathBase { public final com.moplus.moplus_server.domain.problem.domain.QAnswer answer; + public final EnumPath answerType = createEnum("answerType", com.moplus.moplus_server.domain.problem.domain.problem.AnswerType.class); + public final SetPath> conceptTagIds = this.>createSet("conceptTagIds", Long.class, NumberPath.class, PathInits.DIRECT2); //inherited @@ -35,8 +37,6 @@ public class QChildProblem extends EntityPathBase { public final StringPath imageUrl = createString("imageUrl"); - public final EnumPath problemType = createEnum("problemType", com.moplus.moplus_server.domain.problem.domain.problem.ProblemType.class); - public final NumberPath sequence = createNumber("sequence", Integer.class); //inherited diff --git a/src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblem.java b/src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblem.java index fb35ae5..41612a2 100644 --- a/src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblem.java +++ b/src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblem.java @@ -26,37 +26,41 @@ public class QProblem extends EntityPathBase { public final com.moplus.moplus_server.domain.problem.domain.QAnswer answer; - public final ListPath childProblems = this.createList("childProblems", com.moplus.moplus_server.domain.problem.domain.childProblem.ChildProblem.class, com.moplus.moplus_server.domain.problem.domain.childProblem.QChildProblem.class, PathInits.DIRECT2); + public final EnumPath answerType = createEnum("answerType", AnswerType.class); - public final StringPath comment = createString("comment"); + public final ListPath childProblems = this.createList("childProblems", com.moplus.moplus_server.domain.problem.domain.childProblem.ChildProblem.class, com.moplus.moplus_server.domain.problem.domain.childProblem.QChildProblem.class, PathInits.DIRECT2); public final SetPath> conceptTagIds = this.>createSet("conceptTagIds", Long.class, NumberPath.class, PathInits.DIRECT2); //inherited public final DateTimePath createdDate = _super.createdDate; - public final QProblemId id; - - public final BooleanPath isPublished = createBoolean("isPublished"); + public final NumberPath id = createNumber("id", Long.class); - public final BooleanPath isVariation = createBoolean("isVariation"); + public final BooleanPath isConfirmed = createBoolean("isConfirmed"); public final StringPath mainAnalysisImageUrl = createString("mainAnalysisImageUrl"); public final StringPath mainProblemImageUrl = createString("mainProblemImageUrl"); + public final StringPath memo = createString("memo"); + public final NumberPath number = createNumber("number", Integer.class); public final NumberPath practiceTestId = createNumber("practiceTestId", Long.class); public final StringPath prescriptionImageUrl = createString("prescriptionImageUrl"); + public final QProblemAdminId problemAdminId; + public final EnumPath problemType = createEnum("problemType", ProblemType.class); public final StringPath readingTipImageUrl = createString("readingTipImageUrl"); public final StringPath seniorTipImageUrl = createString("seniorTipImageUrl"); + public final StringPath title = createString("title"); + //inherited public final DateTimePath updatedDate = _super.updatedDate; @@ -79,7 +83,7 @@ public QProblem(PathMetadata metadata, PathInits inits) { public QProblem(Class type, PathMetadata metadata, PathInits inits) { super(type, metadata, inits); this.answer = inits.isInitialized("answer") ? new com.moplus.moplus_server.domain.problem.domain.QAnswer(forProperty("answer")) : null; - this.id = inits.isInitialized("id") ? new QProblemId(forProperty("id")) : null; + this.problemAdminId = inits.isInitialized("problemAdminId") ? new QProblemAdminId(forProperty("problemAdminId")) : null; } } diff --git a/src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblemAdminId.java b/src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblemAdminId.java new file mode 100644 index 0000000..d7e56ee --- /dev/null +++ b/src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblemAdminId.java @@ -0,0 +1,37 @@ +package com.moplus.moplus_server.domain.problem.domain.problem; + +import static com.querydsl.core.types.PathMetadataFactory.*; + +import com.querydsl.core.types.dsl.*; + +import com.querydsl.core.types.PathMetadata; +import javax.annotation.processing.Generated; +import com.querydsl.core.types.Path; + + +/** + * QProblemAdminId is a Querydsl query type for ProblemAdminId + */ +@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") +public class QProblemAdminId extends BeanPath { + + private static final long serialVersionUID = 348147768L; + + public static final QProblemAdminId problemAdminId = new QProblemAdminId("problemAdminId"); + + public final StringPath id = createString("id"); + + public QProblemAdminId(String variable) { + super(ProblemAdminId.class, forVariable(variable)); + } + + public QProblemAdminId(Path path) { + super(path.getType(), path.getMetadata()); + } + + public QProblemAdminId(PathMetadata metadata) { + super(ProblemAdminId.class, metadata); + } + +} + diff --git a/src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblemId.java b/src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblemId.java deleted file mode 100644 index ca7809a..0000000 --- a/src/main/generated/com/moplus/moplus_server/domain/problem/domain/problem/QProblemId.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.moplus.moplus_server.domain.problem.domain.problem; - -import static com.querydsl.core.types.PathMetadataFactory.*; - -import com.querydsl.core.types.dsl.*; - -import com.querydsl.core.types.PathMetadata; -import javax.annotation.processing.Generated; -import com.querydsl.core.types.Path; - - -/** - * QProblemId is a Querydsl query type for ProblemId - */ -@Generated("com.querydsl.codegen.DefaultEmbeddableSerializer") -public class QProblemId extends BeanPath { - - private static final long serialVersionUID = -1309260563L; - - public static final QProblemId problemId = new QProblemId("problemId"); - - public final StringPath id = createString("id"); - - public QProblemId(String variable) { - super(ProblemId.class, forVariable(variable)); - } - - public QProblemId(Path path) { - super(path.getType(), path.getMetadata()); - } - - public QProblemId(PathMetadata metadata) { - super(ProblemId.class, metadata); - } - -} - 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 e764eac..dc056d0 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 @@ -10,7 +10,7 @@ @Generated( value = "org.mapstruct.ap.MappingProcessor", - date = "2025-02-08T16:27:45+0900", + date = "2025-02-12T02:55:03+0900", comments = "version: 1.6.3, compiler: javac, environment: Java 17.0.10 (JetBrains s.r.o.)" ) @Component @@ -25,7 +25,7 @@ public ChildProblem from(ChildProblemPostRequest request) { ChildProblem.ChildProblemBuilder childProblem = ChildProblem.builder(); childProblem.imageUrl( request.imageUrl() ); - childProblem.problemType( request.problemType() ); + childProblem.answerType( request.answerType() ); childProblem.answer( request.answer() ); Set set = request.conceptTagIds(); if ( set != null ) { @@ -45,7 +45,7 @@ public ChildProblem from(ChildProblemUpdateRequest request) { ChildProblem.ChildProblemBuilder childProblem = ChildProblem.builder(); childProblem.imageUrl( request.imageUrl() ); - childProblem.problemType( request.problemType() ); + childProblem.answerType( request.answerType() ); childProblem.answer( request.answer() ); Set set = request.conceptTagIds(); if ( set != null ) { 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 21c19b6..e8b0d28 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 @@ -2,7 +2,7 @@ import com.moplus.moplus_server.domain.problem.domain.practiceTest.PracticeTestTag; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; import com.moplus.moplus_server.domain.problem.dto.request.ProblemPostRequest; import com.moplus.moplus_server.domain.problem.dto.request.ProblemUpdateRequest; import java.util.LinkedHashSet; @@ -12,62 +12,51 @@ @Generated( value = "org.mapstruct.ap.MappingProcessor", - date = "2025-02-08T16:27:45+0900", + date = "2025-02-12T02:55:03+0900", comments = "version: 1.6.3, compiler: javac, environment: Java 17.0.10 (JetBrains s.r.o.)" ) @Component public class ProblemMapperImpl implements ProblemMapper { @Override - public Problem from(ProblemPostRequest request, ProblemId problemId, PracticeTestTag practiceTestTag) { - if ( request == null && problemId == null && practiceTestTag == null ) { + public Problem from(ProblemPostRequest request, ProblemAdminId problemAdminId, PracticeTestTag practiceTestTag) { + if ( request == null && problemAdminId == null && practiceTestTag == null ) { return null; } Problem.ProblemBuilder problem = Problem.builder(); if ( request != null ) { + problem.problemType( request.problemType() ); problem.number( request.number() ); - problem.answer( request.answer() ); - problem.comment( request.comment() ); - problem.mainProblemImageUrl( request.mainProblemImageUrl() ); - problem.mainAnalysisImageUrl( request.mainAnalysisImageUrl() ); - problem.readingTipImageUrl( request.readingTipImageUrl() ); - problem.seniorTipImageUrl( request.seniorTipImageUrl() ); - problem.prescriptionImageUrl( request.prescriptionImageUrl() ); - Set set = request.conceptTagIds(); - if ( set != null ) { - problem.conceptTagIds( new LinkedHashSet( set ) ); - } } - problem.id( problemId ); + problem.problemAdminId( problemAdminId ); problem.practiceTestTag( practiceTestTag ); return problem.build(); } @Override - public Problem from(ProblemUpdateRequest request, ProblemId problemId, PracticeTestTag practiceTestTag) { - if ( request == null && problemId == null && practiceTestTag == null ) { + public Problem from(ProblemUpdateRequest request, ProblemAdminId problemAdminId, PracticeTestTag practiceTestTag) { + if ( request == null && problemAdminId == null && practiceTestTag == null ) { return null; } Problem.ProblemBuilder problem = Problem.builder(); if ( request != null ) { - problem.answer( String.valueOf( request.answer() ) ); - problem.comment( request.comment() ); - problem.mainProblemImageUrl( request.mainProblemImageUrl() ); - problem.mainAnalysisImageUrl( request.mainAnalysisImageUrl() ); - problem.readingTipImageUrl( request.readingTipImageUrl() ); - problem.seniorTipImageUrl( request.seniorTipImageUrl() ); - problem.prescriptionImageUrl( request.prescriptionImageUrl() ); Set set = request.conceptTagIds(); if ( set != null ) { problem.conceptTagIds( new LinkedHashSet( set ) ); } + problem.prescriptionImageUrl( request.prescriptionImageUrl() ); + problem.seniorTipImageUrl( request.seniorTipImageUrl() ); + problem.readingTipImageUrl( request.readingTipImageUrl() ); + problem.mainAnalysisImageUrl( request.mainAnalysisImageUrl() ); + problem.mainProblemImageUrl( request.mainProblemImageUrl() ); + problem.answer( request.answer() ); } - problem.id( problemId ); + problem.problemAdminId( problemAdminId ); problem.practiceTestTag( practiceTestTag ); return problem.build(); diff --git a/src/main/generated/com/moplus/moplus_server/domain/problemset/domain/QProblemSet.java b/src/main/generated/com/moplus/moplus_server/domain/problemset/domain/QProblemSet.java index 3f0c463..e859dd4 100644 --- a/src/main/generated/com/moplus/moplus_server/domain/problemset/domain/QProblemSet.java +++ b/src/main/generated/com/moplus/moplus_server/domain/problemset/domain/QProblemSet.java @@ -33,7 +33,7 @@ public class QProblemSet extends EntityPathBase { public final BooleanPath isDeleted = createBoolean("isDeleted"); - public final ListPath problemIds = this.createList("problemIds", com.moplus.moplus_server.domain.problem.domain.problem.ProblemId.class, com.moplus.moplus_server.domain.problem.domain.problem.QProblemId.class, PathInits.DIRECT2); + public final ListPath problemAdminIds = this.createList("problemAdminIds", com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId.class, com.moplus.moplus_server.domain.problem.domain.problem.QProblemAdminId.class, PathInits.DIRECT2); public final QTitle title; diff --git a/src/main/java/com/moplus/moplus_server/domain/auth/controller/AuthController.java b/src/main/java/com/moplus/moplus_server/domain/auth/controller/AuthController.java index 48d6cfd..353a056 100644 --- a/src/main/java/com/moplus/moplus_server/domain/auth/controller/AuthController.java +++ b/src/main/java/com/moplus/moplus_server/domain/auth/controller/AuthController.java @@ -1,12 +1,10 @@ package com.moplus.moplus_server.domain.auth.controller; import com.moplus.moplus_server.domain.auth.dto.request.AdminLoginRequest; +import com.moplus.moplus_server.domain.auth.dto.response.TokenResponse; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.headers.Header; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -18,23 +16,12 @@ public class AuthController { @Operation(summary = "어드민 로그인", description = "아아디 패스워드 로그인 후 토큰 발급합니다.") - @ApiResponses(value = { - @ApiResponse( - responseCode = "200", - description = "로그인 성공", - headers = { - @Header(name = "Authorization", description = "Access Token", schema = @Schema(type = "string")), - @Header(name = "RefreshToken", description = "Refresh Token", schema = @Schema(type = "string")) - } - ), - @ApiResponse(responseCode = "400", description = "잘못된 요청"), - @ApiResponse(responseCode = "401", description = "인증 실패") - }) @PostMapping("/admin/login") - public void adminLogin( + public ResponseEntity adminLogin( @RequestBody AdminLoginRequest request ) { // 실제 처리는 Security 필터에서 이루어지며, 이 메서드는 Swagger 명세용입니다. + return null; } - + } diff --git a/src/main/java/com/moplus/moplus_server/domain/auth/dto/response/TokenResponse.java b/src/main/java/com/moplus/moplus_server/domain/auth/dto/response/TokenResponse.java new file mode 100644 index 0000000..a2be86d --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/auth/dto/response/TokenResponse.java @@ -0,0 +1,7 @@ +package com.moplus.moplus_server.domain.auth.dto.response; + +public record TokenResponse( + String accessToken, + String refreshToken +) { +} 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 6772804..0567525 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 @@ -55,7 +55,7 @@ public ResponseEntity updateProblem( @DeleteMapping("/{id}") @Operation(summary = "문항 삭제") - public ResponseEntity updateProblem( + public ResponseEntity updateProblem( @PathVariable("id") String id ) { problemDeleteService.deleteProblem(id); diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/domain/Answer.java b/src/main/java/com/moplus/moplus_server/domain/problem/domain/Answer.java index 2cb733a..ac72243 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/domain/Answer.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/domain/Answer.java @@ -1,6 +1,6 @@ package com.moplus.moplus_server.domain.problem.domain; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemType; +import com.moplus.moplus_server.domain.problem.domain.problem.AnswerType; import com.moplus.moplus_server.global.error.exception.ErrorCode; import com.moplus.moplus_server.global.error.exception.InvalidValueException; import jakarta.persistence.Column; @@ -17,21 +17,21 @@ public class Answer { @Column(name = "answer") private String value; - public Answer(String value, ProblemType problemType) { - validateByType(value, problemType); + public Answer(String value, AnswerType answerType) { + validateByType(value, answerType); this.value = value; } - private void validateByType(String answer, ProblemType problemType) { + private void validateByType(String answer, AnswerType answerType) { if (answer.isBlank()) { throw new InvalidValueException(ErrorCode.BLANK_INPUT_VALUE); } - if (problemType == ProblemType.MULTIPLE_CHOICE) { + if (answerType == AnswerType.MULTIPLE_CHOICE) { if (!answer.matches("^[1-5]*$")) { throw new InvalidValueException(ErrorCode.INVALID_MULTIPLE_CHOICE_ANSWER); } } - if (problemType == ProblemType.SHORT_NUMBER_ANSWER) { + if (answerType == AnswerType.SHORT_NUMBER_ANSWER) { try { int numericAnswer = Integer.parseInt(answer); if (numericAnswer < 0 || numericAnswer > 999) { 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 2067862..2358435 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 @@ -1,7 +1,7 @@ package com.moplus.moplus_server.domain.problem.domain.childProblem; import com.moplus.moplus_server.domain.problem.domain.Answer; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemType; +import com.moplus.moplus_server.domain.problem.domain.problem.AnswerType; 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; @@ -38,22 +38,22 @@ public class ChildProblem extends BaseEntity { @Embedded private Answer answer; @Enumerated(EnumType.STRING) - private ProblemType problemType; + private AnswerType answerType; private int sequence; @Builder - public ChildProblem(String imageUrl, ProblemType problemType, String answer, Set conceptTagIds, + public ChildProblem(String imageUrl, AnswerType answerType, String answer, Set conceptTagIds, int sequence) { - validateAnswerByType(answer, problemType); + validateAnswerByType(answer, answerType); this.imageUrl = imageUrl; - this.problemType = problemType; - this.answer = new Answer(answer, problemType); + this.answerType = answerType; + this.answer = new Answer(answer, answerType); this.conceptTagIds = conceptTagIds; this.sequence = sequence; } - public void validateAnswerByType(String answer, ProblemType problemType) { - if (this.problemType == ProblemType.MULTIPLE_CHOICE) { + public void validateAnswerByType(String answer, AnswerType answerType) { + if (this.answerType == AnswerType.MULTIPLE_CHOICE) { if (!answer.matches("^[1-5]*$")) { throw new InvalidValueException(ErrorCode.INVALID_MULTIPLE_CHOICE_ANSWER); } @@ -62,7 +62,7 @@ public void validateAnswerByType(String answer, ProblemType problemType) { public void update(ChildProblem input) { this.imageUrl = input.imageUrl; - this.problemType = input.problemType; + this.answerType = input.answerType; this.answer = input.answer; this.conceptTagIds = input.conceptTagIds; this.sequence = input.sequence; diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/domain/practiceTest/Subject.java b/src/main/java/com/moplus/moplus_server/domain/problem/domain/practiceTest/Subject.java index 9dd4f16..75678f1 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/domain/practiceTest/Subject.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/domain/practiceTest/Subject.java @@ -19,7 +19,7 @@ public enum Subject { private final String value; private final int problemCount; private final int perfectScore; - private final int idCode; + private final int code; public static Subject fromValue(String value) { return Arrays.stream(Subject.values()) diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/AnswerType.java b/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/AnswerType.java new file mode 100644 index 0000000..27d748d --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/AnswerType.java @@ -0,0 +1,37 @@ +package com.moplus.moplus_server.domain.problem.domain.problem; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum AnswerType { + MULTIPLE_CHOICE("객관식"), + SHORT_NUMBER_ANSWER("주관식_숫자"), + SHORT_STRING_ANSWER("주관식_문자"); + + + private final String name; + + public static AnswerType getTypeForProblem(String subject, int number) { + + // 미적분, 기하, 확률과 통계 + if (subject.equals("미적분") || subject.equals("기하") || subject.equals("확률과통계")) { + if ((number >= 1 && number <= 15) || (number >= 23 && number <= 28)) { + return MULTIPLE_CHOICE; + } else if ((number >= 16 && number <= 22) || number == 29 || number == 30) { + return SHORT_NUMBER_ANSWER; + } + } + + // 고1, 고2 + if (subject.equals("고1") || subject.equals("고2")) { + if (number >= 1 && number <= 21) { + return MULTIPLE_CHOICE; + } else if (number >= 22 && number <= 30) { + return SHORT_NUMBER_ANSWER; + } + } + + // 기본값: 객관식 + return MULTIPLE_CHOICE; + } +} 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 e8c7814..f587281 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 @@ -9,9 +9,13 @@ import jakarta.persistence.Column; import jakarta.persistence.ElementCollection; import jakarta.persistence.Embedded; -import jakarta.persistence.EmbeddedId; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToMany; import jakarta.persistence.OrderBy; @@ -29,14 +33,16 @@ @NoArgsConstructor public class Problem extends BaseEntity { - @EmbeddedId - ProblemId id; - + @Embedded + ProblemAdminId problemAdminId; Long practiceTestId; int number; + @Enumerated(EnumType.STRING) + ProblemType problemType; + String title; @Embedded Answer answer; - String comment; + String memo; String mainProblemImageUrl; String mainAnalysisImageUrl; String readingTipImageUrl; @@ -46,9 +52,16 @@ public class Problem extends BaseEntity { @CollectionTable(name = "problem_concept", joinColumns = @JoinColumn(name = "problem_id")) @Column(name = "concept_tag_id") Set conceptTagIds; - private ProblemType problemType; - private boolean isPublished; - private boolean isVariation; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "problem_id") + private Long id; + + @Enumerated(EnumType.STRING) + private AnswerType answerType; + + private boolean isConfirmed; @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) @JoinColumn(name = "problem_id") @@ -56,24 +69,28 @@ public class Problem extends BaseEntity { private List childProblems = new ArrayList<>(); @Builder - public Problem(ProblemId id, PracticeTestTag practiceTestTag, int number, String answer, String comment, - String mainProblemImageUrl, - String mainAnalysisImageUrl, String readingTipImageUrl, String seniorTipImageUrl, - String prescriptionImageUrl, Set conceptTagIds) { - this.id = id; - this.practiceTestId = practiceTestTag.getId(); - this.number = number; - this.comment = comment; - this.mainProblemImageUrl = mainProblemImageUrl; - this.mainAnalysisImageUrl = mainAnalysisImageUrl; - this.readingTipImageUrl = readingTipImageUrl; - this.seniorTipImageUrl = seniorTipImageUrl; + public Problem(List childProblems, boolean isConfirmed, AnswerType answerType, + Set conceptTagIds, + String prescriptionImageUrl, String seniorTipImageUrl, String readingTipImageUrl, + String mainAnalysisImageUrl, String mainProblemImageUrl, String memo, String answer, String title, + ProblemType problemType, int number, PracticeTestTag practiceTestTag, + ProblemAdminId problemAdminId) { + this.childProblems = childProblems; + this.isConfirmed = isConfirmed; + this.answerType = AnswerType.getTypeForProblem(practiceTestTag.getSubject().getValue(), number); + this.conceptTagIds = conceptTagIds; this.prescriptionImageUrl = prescriptionImageUrl; - this.problemType = ProblemType.getTypeForProblem(practiceTestTag.getSubject().getValue(), number); - this.answer = new Answer(answer, this.problemType); - this.conceptTagIds = new HashSet<>(conceptTagIds); - this.isPublished = false; - this.isVariation = false; + this.seniorTipImageUrl = seniorTipImageUrl; + this.readingTipImageUrl = readingTipImageUrl; + this.mainAnalysisImageUrl = mainAnalysisImageUrl; + this.mainProblemImageUrl = mainProblemImageUrl; + this.memo = memo; + this.answer = new Answer(answer, this.answerType); + this.title = title; + this.problemType = problemType; + this.number = number; + this.practiceTestId = practiceTestTag.getId(); + this.problemAdminId = problemAdminId; } public String getAnswer() { @@ -90,8 +107,8 @@ public void addChildProblem(List inputChildProblems) { public void update(Problem inputProblem) { this.conceptTagIds = new HashSet<>(inputProblem.getConceptTagIds()); this.number = inputProblem.getNumber(); - this.answer = new Answer(inputProblem.getAnswer(), this.problemType); - this.comment = inputProblem.getComment(); + this.answer = new Answer(inputProblem.getAnswer(), this.answerType); + this.memo = inputProblem.getMemo(); this.mainProblemImageUrl = inputProblem.getMainProblemImageUrl(); this.mainAnalysisImageUrl = inputProblem.getMainAnalysisImageUrl(); this.readingTipImageUrl = inputProblem.getReadingTipImageUrl(); @@ -124,7 +141,7 @@ public void deleteChildProblem(List deleteChildProblems) { public boolean isValid() { return answer != null && !answer.getValue().isEmpty() && practiceTestId != null - && comment != null && !comment.isEmpty() + && memo != null && !memo.isEmpty() && readingTipImageUrl != null && !readingTipImageUrl.isEmpty() && seniorTipImageUrl != null && !seniorTipImageUrl.isEmpty() && prescriptionImageUrl != null && !prescriptionImageUrl.isEmpty() diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemId.java b/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemAdminId.java similarity index 70% rename from src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemId.java rename to src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemAdminId.java index 2bc4343..163cd8b 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemId.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemAdminId.java @@ -9,12 +9,12 @@ @Getter @Embeddable @NoArgsConstructor -public class ProblemId implements Serializable { +public class ProblemAdminId implements Serializable { - @Column(name = "problem_id") + @Column(name = "problem_admin_id") private String id; - public ProblemId(String id) { + public ProblemAdminId(String id) { this.id = id; } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemIdService.java b/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemIdService.java index f3d3e82..c7ad631 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemIdService.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemIdService.java @@ -15,33 +15,30 @@ public class ProblemIdService { /* 문제 ID 생성 로직 + C : 문제 타입 ( 1: 기출문제, 2: 변형문제, 3: 창작문제 ) + S : ( 1: 고1, 2: 고2, 3: 미적분, 4: 기하, 5: 확률과 통계, 6: 가형, 7: 나형 ) YY: 년도 (두 자리) MM: 월 (두 자리) NN : 번호 (01~99) - AA : 영역 ( 01: 수학, 02: 영어, 03: 국어, 04: 사회, 05: 과학 ) - S : ( 1: 고1, 2: 고2, 3: 미적분, 4: 기하, 5: 확률과 통계, 6: 가형, 7: 나형 ) - C : 변형 여부 ( 0: 기본, 1: 변형 ) - XXX : 3자리 구분 숫자 + XX : 2자리 sequence 숫자 */ - public ProblemId nextId(int number, PracticeTestTag practiceTestTag) { + public ProblemAdminId nextId(int number, PracticeTestTag practiceTestTag, ProblemType problemType) { - int DEFAULT_AREA = 1; //현재 영역은 수학밖에 없음 - int subject = practiceTestTag.getSubject().getIdCode(); // AA (과목) + int problemTypeCode = problemType.getCode(); // C (문제 타입) + int subject = practiceTestTag.getSubject().getCode(); // S (과목) int year = practiceTestTag.getYear() % 100; // YY (두 자리 연도) int month = practiceTestTag.getMonth(); // MM (두 자리 월) - int DEFAULT_MODIFIED = 0; // 변형 여부 (0: 기본, 1: 변형) String generatedId; int sequence; // 중복되지 않는 ID 찾을 때까지 반복 do { - sequence = SEQUENCE.getAndIncrement() % 1000; // 000~999 순환 - generatedId = String.format("%02d%02d%02d%02d%d%d%03d", - year, month, number, DEFAULT_AREA, - subject, DEFAULT_MODIFIED, sequence); - } while (problemRepository.existsById(new ProblemId(generatedId))); // ID가 이미 존재하면 재생성 + sequence = SEQUENCE.getAndIncrement() % 100; // 000~999 순환 + generatedId = String.format("%d%d%02d%02d%02d%02d", + problemTypeCode, subject, year, month, number, sequence); + } while (problemRepository.existsById(new ProblemAdminId(generatedId))); // ID가 이미 존재하면 재생성 - return new ProblemId(generatedId); + return new ProblemAdminId(generatedId); } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemType.java b/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemType.java index 2410bcf..e02d101 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemType.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/domain/problem/ProblemType.java @@ -1,37 +1,16 @@ package com.moplus.moplus_server.domain.problem.domain.problem; +import lombok.Getter; import lombok.RequiredArgsConstructor; +@Getter @RequiredArgsConstructor public enum ProblemType { - MULTIPLE_CHOICE("객관식"), - SHORT_NUMBER_ANSWER("주관식_숫자"), - SHORT_STRING_ANSWER("주관식_문자"); + GICHUL_PROBLEM("기출문제", 1), + VARIANT_PROBLEM("변형문제", 2), + CREATION_PROBLEM("창작문제", 3); private final String name; - - public static ProblemType getTypeForProblem(String subject, int number) { - - // 미적분, 기하, 확률과 통계 - if (subject.equals("미적분") || subject.equals("기하") || subject.equals("확률과통계")) { - if ((number >= 1 && number <= 15) || (number >= 23 && number <= 28)) { - return MULTIPLE_CHOICE; - } else if ((number >= 16 && number <= 22) || number == 29 || number == 30) { - return SHORT_NUMBER_ANSWER; - } - } - - // 고1, 고2 - if (subject.equals("고1") || subject.equals("고2")) { - if (number >= 1 && number <= 21) { - return MULTIPLE_CHOICE; - } else if (number >= 22 && number <= 30) { - return SHORT_NUMBER_ANSWER; - } - } - - // 기본값: 객관식 - return MULTIPLE_CHOICE; - } + private final int code; } 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 1b42975..fc3e302 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 @@ -1,11 +1,11 @@ package com.moplus.moplus_server.domain.problem.dto.request; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemType; +import com.moplus.moplus_server.domain.problem.domain.problem.AnswerType; import java.util.Set; public record ChildProblemPostRequest( String imageUrl, - ProblemType problemType, + AnswerType answerType, String answer, 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 d080b17..19ba8ff 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 @@ -1,6 +1,6 @@ package com.moplus.moplus_server.domain.problem.dto.request; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemType; +import com.moplus.moplus_server.domain.problem.domain.problem.AnswerType; import io.swagger.v3.oas.annotations.media.Schema; import java.util.Set; @@ -8,7 +8,7 @@ public record ChildProblemUpdateRequest( @Schema(description = "새로 생성되는 새끼문항은 빈 값입니다.") Long id, String imageUrl, - ProblemType problemType, + AnswerType answerType, String answer, Set conceptTagIds, int sequence diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ProblemPostRequest.java b/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ProblemPostRequest.java index d6e5821..3746ed5 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ProblemPostRequest.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ProblemPostRequest.java @@ -2,36 +2,20 @@ import com.moplus.moplus_server.domain.problem.domain.practiceTest.PracticeTestTag; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; -import java.util.List; -import java.util.Set; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemType; public record ProblemPostRequest( - Set conceptTagIds, + ProblemType problemType, Long practiceTestId, - int number, - String answer, - String comment, - String mainProblemImageUrl, - String mainAnalysisImageUrl, - String readingTipImageUrl, - String seniorTipImageUrl, - String prescriptionImageUrl, - List childProblems + int number ) { - public Problem toEntity(PracticeTestTag practiceTestTag, ProblemId problemId) { + public Problem toEntity(PracticeTestTag practiceTestTag, ProblemAdminId problemAdminId) { return Problem.builder() - .id(problemId) - .conceptTagIds(conceptTagIds) + .problemAdminId(problemAdminId) .practiceTestTag(practiceTestTag) .number(number) - .answer(answer) - .comment(comment) - .mainProblemImageUrl(mainProblemImageUrl) - .mainAnalysisImageUrl(mainAnalysisImageUrl) - .readingTipImageUrl(readingTipImageUrl) - .seniorTipImageUrl(seniorTipImageUrl) - .prescriptionImageUrl(prescriptionImageUrl) + .problemType(problemType) .build(); } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ProblemUpdateRequest.java b/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ProblemUpdateRequest.java index 9e04f0d..6ea8677 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ProblemUpdateRequest.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/dto/request/ProblemUpdateRequest.java @@ -5,7 +5,7 @@ public record ProblemUpdateRequest( Set conceptTagIds, - int answer, + String answer, String comment, String mainProblemImageUrl, String mainAnalysisImageUrl, 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 1641d2c..ae7552a 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 @@ -1,7 +1,7 @@ package com.moplus.moplus_server.domain.problem.dto.response; import com.moplus.moplus_server.domain.problem.domain.childProblem.ChildProblem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemType; +import com.moplus.moplus_server.domain.problem.domain.problem.AnswerType; import java.util.Set; import lombok.Builder; @@ -9,7 +9,7 @@ public record ChildProblemGetResponse( Long childProblemId, String imageUrl, - ProblemType problemType, + AnswerType answerType, String answer, Set conceptTagIds ) { @@ -18,7 +18,7 @@ public static ChildProblemGetResponse of(ChildProblem childProblem) { return ChildProblemGetResponse.builder() .childProblemId(childProblem.getId()) .imageUrl(childProblem.getImageUrl()) - .problemType(childProblem.getProblemType()) + .answerType(childProblem.getAnswerType()) .answer(childProblem.getAnswer()) .conceptTagIds(childProblem.getConceptTagIds()) .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 1947067..50e90b8 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 @@ -1,6 +1,8 @@ package com.moplus.moplus_server.domain.problem.dto.response; +import com.moplus.moplus_server.domain.problem.domain.problem.AnswerType; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemType; import java.util.List; import java.util.Set; import lombok.Builder; @@ -13,6 +15,8 @@ public record ProblemGetResponse( int number, String answer, String comment, + ProblemType problemType, + AnswerType answerType, String mainProblemImageUrl, String mainAnalysisImageUrl, String readingTipImageUrl, @@ -28,7 +32,9 @@ public static ProblemGetResponse of(Problem problem) { .practiceTestId(problem.getPracticeTestId()) .number(problem.getNumber()) .answer(problem.getAnswer()) - .comment(problem.getComment()) + .comment(problem.getMemo()) + .problemType(problem.getProblemType()) + .answerType(problem.getAnswerType()) .mainProblemImageUrl(problem.getMainProblemImageUrl()) .mainAnalysisImageUrl(problem.getMainAnalysisImageUrl()) .readingTipImageUrl(problem.getReadingTipImageUrl()) 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 a45c8f4..50d7132 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 @@ -1,29 +1,21 @@ package com.moplus.moplus_server.domain.problem.repository; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; -import com.moplus.moplus_server.global.error.exception.AlreadyExistException; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; import com.moplus.moplus_server.global.error.exception.ErrorCode; import com.moplus.moplus_server.global.error.exception.NotFoundException; import org.springframework.data.jpa.repository.JpaRepository; -public interface ProblemRepository extends JpaRepository { +public interface ProblemRepository extends JpaRepository { - boolean existsByPracticeTestIdAndNumber(Long practiceTestId, int number); - default void existsByPracticeTestIdAndNumberOrThrow(Long practiceTestId, int number) { - if (existsByPracticeTestIdAndNumber(practiceTestId, number)) { - throw new AlreadyExistException(ErrorCode.PROBLEM_ALREADY_EXIST); - } - } - - default void existsByIdElseThrow(ProblemId problemId) { - if (!existsById(problemId)) { + default void existsByIdElseThrow(ProblemAdminId problemAdminId) { + if (!existsById(problemAdminId)) { throw new NotFoundException(ErrorCode.PROBLEM_NOT_FOUND); } } - default Problem findByIdElseThrow(ProblemId problemId) { - return findById(problemId).orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_NOT_FOUND)); + default Problem findByIdElseThrow(ProblemAdminId problemAdminId) { + return findById(problemAdminId).orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_NOT_FOUND)); } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemDeleteService.java b/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemDeleteService.java index 1bb193f..03b6e53 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemDeleteService.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemDeleteService.java @@ -1,6 +1,6 @@ package com.moplus.moplus_server.domain.problem.service; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; import com.moplus.moplus_server.domain.problem.repository.ProblemRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -14,7 +14,7 @@ public class ProblemDeleteService { @Transactional public void deleteProblem(String problemId) { - problemRepository.existsByIdElseThrow(new ProblemId(problemId)); - problemRepository.deleteById(new ProblemId(problemId)); + problemRepository.existsByIdElseThrow(new ProblemAdminId(problemId)); + problemRepository.deleteById(new ProblemAdminId(problemId)); } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemGetService.java b/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemGetService.java index 65dccf1..6abd479 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemGetService.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemGetService.java @@ -1,7 +1,7 @@ package com.moplus.moplus_server.domain.problem.service; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; import com.moplus.moplus_server.domain.problem.dto.response.ProblemGetResponse; import com.moplus.moplus_server.domain.problem.repository.ProblemRepository; import lombok.RequiredArgsConstructor; @@ -16,7 +16,7 @@ public class ProblemGetService { @Transactional(readOnly = true) public ProblemGetResponse getProblem(String problemId) { - Problem problem = problemRepository.findByIdElseThrow(new ProblemId(problemId)); + Problem problem = problemRepository.findByIdElseThrow(new ProblemAdminId(problemId)); return ProblemGetResponse.of(problem); } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemSaveService.java b/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemSaveService.java index 6db9ddc..b661d89 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemSaveService.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/service/ProblemSaveService.java @@ -1,17 +1,13 @@ package com.moplus.moplus_server.domain.problem.service; -import com.moplus.moplus_server.domain.concept.repository.ConceptTagRepository; -import com.moplus.moplus_server.domain.problem.domain.childProblem.ChildProblem; import com.moplus.moplus_server.domain.problem.domain.practiceTest.PracticeTestTag; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; import com.moplus.moplus_server.domain.problem.domain.problem.ProblemIdService; import com.moplus.moplus_server.domain.problem.dto.request.ProblemPostRequest; import com.moplus.moplus_server.domain.problem.repository.PracticeTestTagRepository; import com.moplus.moplus_server.domain.problem.repository.ProblemRepository; -import com.moplus.moplus_server.domain.problem.service.mapper.ChildProblemMapper; import com.moplus.moplus_server.domain.problem.service.mapper.ProblemMapper; -import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,25 +18,17 @@ public class ProblemSaveService { private final ProblemRepository problemRepository; private final PracticeTestTagRepository practiceTestRepository; - private final ConceptTagRepository conceptTagRepository; private final ProblemIdService problemIdService; private final ProblemMapper problemMapper; - private final ChildProblemMapper childProblemMapper; @Transactional - public ProblemId createProblem(ProblemPostRequest request) { + public ProblemAdminId createProblem(ProblemPostRequest request) { PracticeTestTag practiceTestTag = practiceTestRepository.findByIdElseThrow(request.practiceTestId()); - problemRepository.existsByPracticeTestIdAndNumberOrThrow(practiceTestTag.getId(), request.number()); - conceptTagRepository.existsByIdElseThrow(request.conceptTagIds()); - ProblemId problemId = problemIdService.nextId(request.number(), practiceTestTag); - Problem problem = problemMapper.from(request, problemId, practiceTestTag); + ProblemAdminId problemAdminId = problemIdService.nextId(request.number(), practiceTestTag, + request.problemType()); + Problem problem = problemMapper.from(request, problemAdminId, practiceTestTag); - List childProblems = request.childProblems().stream() - .map(childProblemMapper::from) - .toList(); - problem.addChildProblem(childProblems); - - return problemRepository.save(problem).getId(); + return problemRepository.save(problem).getProblemAdminId(); } } 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 a7f0678..90a5e62 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 @@ -4,7 +4,7 @@ import com.moplus.moplus_server.domain.problem.domain.childProblem.ChildProblem; import com.moplus.moplus_server.domain.problem.domain.practiceTest.PracticeTestTag; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; import com.moplus.moplus_server.domain.problem.dto.request.ChildProblemUpdateRequest; import com.moplus.moplus_server.domain.problem.dto.request.ProblemUpdateRequest; import com.moplus.moplus_server.domain.problem.dto.response.ProblemGetResponse; @@ -32,9 +32,9 @@ public class ProblemUpdateService { @Transactional public ProblemGetResponse updateProblem(String problemId, ProblemUpdateRequest request) { conceptTagRepository.existsByIdElseThrow(request.conceptTagIds()); - Problem problem = problemRepository.findByIdElseThrow(new ProblemId(problemId)); + Problem problem = problemRepository.findByIdElseThrow(new ProblemAdminId(problemId)); PracticeTestTag practiceTestTag = practiceTestRepository.findByIdElseThrow(problem.getPracticeTestId()); - Problem inputProblem = problemMapper.from(request, problem.getId(), practiceTestTag); + Problem inputProblem = problemMapper.from(request, problem.getProblemAdminId(), practiceTestTag); problem.update(inputProblem); problem.deleteChildProblem(request.deleteChildProblems()); diff --git a/src/main/java/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapper.java b/src/main/java/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapper.java index f1244a2..5497c41 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapper.java +++ b/src/main/java/com/moplus/moplus_server/domain/problem/service/mapper/ProblemMapper.java @@ -2,7 +2,7 @@ import com.moplus.moplus_server.domain.problem.domain.practiceTest.PracticeTestTag; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; import com.moplus.moplus_server.domain.problem.dto.request.ProblemPostRequest; import com.moplus.moplus_server.domain.problem.dto.request.ProblemUpdateRequest; import org.mapstruct.Mapper; @@ -13,14 +13,14 @@ public interface ProblemMapper { @Mappings({ - @Mapping(target = "id", source = "problemId"), + @Mapping(target = "problemAdminId", source = "problemAdminId"), @Mapping(target = "practiceTestTag", source = "practiceTestTag"), }) - Problem from(ProblemPostRequest request, ProblemId problemId, PracticeTestTag practiceTestTag); + Problem from(ProblemPostRequest request, ProblemAdminId problemAdminId, PracticeTestTag practiceTestTag); @Mappings({ - @Mapping(target = "id", source = "problemId"), + @Mapping(target = "problemAdminId", source = "problemAdminId"), @Mapping(target = "practiceTestTag", source = "practiceTestTag"), }) - Problem from(ProblemUpdateRequest request, ProblemId problemId, PracticeTestTag practiceTestTag); + Problem from(ProblemUpdateRequest request, ProblemAdminId problemAdminId, PracticeTestTag practiceTestTag); } diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSet.java b/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSet.java index bcd4d16..268b392 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSet.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSet.java @@ -1,7 +1,7 @@ package com.moplus.moplus_server.domain.problemset.domain; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; 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; @@ -43,20 +43,20 @@ public class ProblemSet extends BaseEntity { @ElementCollection @CollectionTable(name = "problem_set_problems", joinColumns = @JoinColumn(name = "problem_set_id")) - @Column(name = "problem_id") + @Column(name = "problem_admin_id") @OrderColumn(name = "sequence") - private List problemIds = new ArrayList<>(); + private List problemAdminIds = new ArrayList<>(); @Builder - public ProblemSet(String title, List problemIds) { + public ProblemSet(String title, List problemAdminIds) { this.title = new Title(title); this.isDeleted = false; this.confirmStatus = ProblemSetConfirmStatus.NOT_CONFIRMED; - this.problemIds = problemIds; + this.problemAdminIds = problemAdminIds; } - public void updateProblemOrder(List newProblems) { - this.problemIds = new ArrayList<>(newProblems); + public void updateProblemOrder(List newProblems) { + this.problemAdminIds = new ArrayList<>(newProblems); } public void deleteProblemSet() { @@ -64,10 +64,10 @@ public void deleteProblemSet() { } public void toggleConfirm(List problems) { - if(this.confirmStatus == ProblemSetConfirmStatus.NOT_CONFIRMED){ + if (this.confirmStatus == ProblemSetConfirmStatus.NOT_CONFIRMED) { List invalidProblemIds = problems.stream() .filter(problem -> !problem.isValid()) - .map(problem -> problem.getId().getId()) + .map(problem -> problem.getProblemAdminId().getId()) .toList(); if (!invalidProblemIds.isEmpty()) { String message = ErrorCode.INVALID_CONFIRM_PROBLEM.getMessage() + @@ -78,8 +78,8 @@ public void toggleConfirm(List problems) { this.confirmStatus = this.confirmStatus.toggle(); } - public void updateProblemSet(String title, List newProblems) { + public void updateProblemSet(String title, List newProblems) { this.title = new Title(title); - this.problemIds = newProblems; + this.problemAdminIds = newProblems; } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetPostRequest.java b/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetPostRequest.java index eb50f4d..0de61e7 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetPostRequest.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetPostRequest.java @@ -1,6 +1,6 @@ package com.moplus.moplus_server.domain.problemset.dto.request; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; import java.util.List; @@ -8,10 +8,10 @@ public record ProblemSetPostRequest( String problemSetTitle, List problems ) { - public ProblemSet toEntity(List problemIdList) { + public ProblemSet toEntity(List problemAdminIdList) { return ProblemSet.builder() .title(this.problemSetTitle) - .problemIds(problemIdList) + .problemAdminIds(problemAdminIdList) .build(); } } 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 b563593..024d9ab 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 @@ -9,7 +9,7 @@ public record ProblemSummaryResponse( String problemId, int number, String practiceTestName, - String comment, + String memo, String mainProblemImageUrl, List tagNames ) { @@ -18,7 +18,7 @@ public static ProblemSummaryResponse of(Problem problem, String practiceTestName return ProblemSummaryResponse.builder() .problemId(problem.getId().toString()) .number(problem.getNumber()) - .comment(problem.getComment()) + .memo(problem.getMemo()) .mainProblemImageUrl(problem.getMainProblemImageUrl()) .practiceTestName(practiceTestName) .tagNames(tagNames) diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetSearchRepositoryCustom.java b/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetSearchRepositoryCustom.java index 9bf6d22..8cccfba 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetSearchRepositoryCustom.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetSearchRepositoryCustom.java @@ -22,10 +22,11 @@ public class ProblemSetSearchRepositoryCustom { private final JPAQueryFactory queryFactory; - public List search(String problemSetTitle, String problemTitle, List conceptTagNames) { + public List search(String problemSetTitle, String problemTitle, + List conceptTagNames) { return queryFactory .from(problemSet) - .leftJoin(problem).on(problem.id.in(problemSet.problemIds)) // 문제 세트 내 포함된 문항과 조인 + .leftJoin(problem).on(problem.problemAdminId.in(problemSet.problemAdminIds)) // 문제 세트 내 포함된 문항과 조인 .leftJoin(conceptTag).on(conceptTag.id.in(problem.conceptTagIds)) // 문제의 개념 태그 조인 .leftJoin(publish).on(publish.problemSetId.eq(problemSet.id)) // 문제 세트와 발행 데이터 조인 .where( @@ -48,10 +49,11 @@ public List search(String problemSetTitle, String p )); } - public List confirmSearch(String problemSetTitle, String problemTitle, List conceptTagNames) { + public List confirmSearch(String problemSetTitle, String problemTitle, + List conceptTagNames) { return queryFactory .from(problemSet) - .leftJoin(problem).on(problem.id.in(problemSet.problemIds)) // 문제 세트 내 포함된 문항과 조인 + .leftJoin(problem).on(problem.problemAdminId.in(problemSet.problemAdminIds)) // 문제 세트 내 포함된 문항과 조인 .leftJoin(conceptTag).on(conceptTag.id.in(problem.conceptTagIds)) // 문제의 개념 태그 조인 .leftJoin(publish).on(publish.problemSetId.eq(problemSet.id)) // 문제 세트와 발행 데이터 조인 .where( @@ -76,11 +78,12 @@ public List confirmSearch(String problemSetTitle, S } private BooleanExpression containsProblemSetTitle(String problemSetTitle) { - return (problemSetTitle == null || problemSetTitle.isEmpty()) ? null : problemSet.title.value.containsIgnoreCase(problemSetTitle); + return (problemSetTitle == null || problemSetTitle.isEmpty()) ? null + : problemSet.title.value.containsIgnoreCase(problemSetTitle); } private BooleanExpression containsProblemTitle(String problemTitle) { - return (problemTitle == null || problemTitle.isEmpty()) ? null : problem.comment.containsIgnoreCase(problemTitle); + return (problemTitle == null || problemTitle.isEmpty()) ? null : problem.memo.containsIgnoreCase(problemTitle); } private BooleanExpression containsConceptTagNames(List conceptTagNames) { 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 3392a8d..f236958 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 @@ -4,7 +4,7 @@ import com.moplus.moplus_server.domain.concept.repository.ConceptTagRepository; import com.moplus.moplus_server.domain.problem.domain.practiceTest.PracticeTestTag; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; 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; @@ -39,8 +39,8 @@ public ProblemSetGetResponse getProblemSet(Long problemSetId) { .orElse(null); List problemSummaries = new ArrayList<>(); - for (ProblemId problemId : problemSet.getProblemIds()) { - Problem problem = problemRepository.findByIdElseThrow(problemId); + for (ProblemAdminId problemAdminId : problemSet.getProblemAdminIds()) { + Problem problem = problemRepository.findByIdElseThrow(problemAdminId); PracticeTestTag practiceTestTag = practiceTestTagRepository.findByIdElseThrow(problem.getPracticeTestId()); List tagNames = conceptTagRepository.findAllByIdsElseThrow(problem.getConceptTagIds()) .stream() diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetSaveService.java b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetSaveService.java index c363815..57627ae 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetSaveService.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetSaveService.java @@ -1,6 +1,6 @@ package com.moplus.moplus_server.domain.problemset.service; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; 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.request.ProblemSetPostRequest; @@ -27,15 +27,15 @@ public Long createProblemSet(ProblemSetPostRequest request) { } // 문제 ID 리스트를 ProblemId 객체로 변환 - List problemIdList = request.problems().stream() - .map(ProblemId::new) + List problemAdminIdList = request.problems().stream() + .map(ProblemAdminId::new) .toList(); // 모든 문항이 DB에 존재하는지 검증 - problemIdList.forEach(problemRepository::findByIdElseThrow); + problemAdminIdList.forEach(problemRepository::findByIdElseThrow); // ProblemSet 생성 - ProblemSet problemSet = request.toEntity(problemIdList); + ProblemSet problemSet = request.toEntity(problemAdminIdList); return problemSetRepository.save(problemSet).getId(); } diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetUpdateService.java b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetUpdateService.java index 92134ac..3bb8fc9 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetUpdateService.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetUpdateService.java @@ -1,7 +1,7 @@ package com.moplus.moplus_server.domain.problemset.service; import com.moplus.moplus_server.domain.problem.domain.problem.Problem; -import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemAdminId; 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.domain.ProblemSetConfirmStatus; @@ -29,11 +29,11 @@ public void reorderProblems(Long problemSetId, ProblemReorderRequest request) { ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); // 기존 문항 ID 리스트 업데이트 (순서 반영) - List updatedProblemIds = request.newProblems().stream() - .map(ProblemId::new) + List updatedProblemAdminIds = request.newProblems().stream() + .map(ProblemAdminId::new) .collect(Collectors.toList()); - problemSet.updateProblemOrder(updatedProblemIds); + problemSet.updateProblemOrder(updatedProblemAdminIds); } @Transactional @@ -46,20 +46,20 @@ public void updateProblemSet(Long problemSetId, ProblemSetUpdateRequest request) } // 문항 리스트 검증 - List problemIdList = request.problems().stream() - .map(ProblemId::new) + List problemAdminIdList = request.problems().stream() + .map(ProblemAdminId::new) .collect(Collectors.toList()); - problemIdList.forEach(problemRepository::findByIdElseThrow); + problemAdminIdList.forEach(problemRepository::findByIdElseThrow); - problemSet.updateProblemSet(request.problemSetTitle(), problemIdList); + problemSet.updateProblemSet(request.problemSetTitle(), problemAdminIdList); } @Transactional public ProblemSetConfirmStatus toggleConfirmProblemSet(Long problemSetId) { ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); List problems = new ArrayList<>(); - for (ProblemId problemId : problemSet.getProblemIds()) { - Problem problem = problemRepository.findByIdElseThrow(problemId); + for (ProblemAdminId problemAdminId : problemSet.getProblemAdminIds()) { + Problem problem = problemRepository.findByIdElseThrow(problemAdminId); problems.add(problem); } problemSet.toggleConfirm(problems); diff --git a/src/main/resources/templates/answerInputForm.html b/src/main/resources/templates/answerInputForm.html index 6fd3d02..08e8d99 100644 --- a/src/main/resources/templates/answerInputForm.html +++ b/src/main/resources/templates/answerInputForm.html @@ -8,7 +8,7 @@