From 000f92a16a0f6c940719de3aa8da62fe2417c52e Mon Sep 17 00:00:00 2001 From: HongGit Date: Sat, 1 Feb 2025 01:00:33 +0900 Subject: [PATCH 01/19] =?UTF-8?q?[feat/#29]=20=EB=AC=B8=ED=95=AD=20?= =?UTF-8?q?=EC=84=B8=ED=8A=B8=20=EB=A3=A8=ED=8A=B8=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/problemset/domain/ProblemSet.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSet.java 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 new file mode 100644 index 0000000..e7cc222 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSet.java @@ -0,0 +1,46 @@ +package com.moplus.moplus_server.domain.problemset.domain; + +import com.moplus.moplus_server.global.common.BaseEntity; +import jakarta.persistence.CollectionTable; +import jakarta.persistence.Column; +import jakarta.persistence.ElementCollection; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import java.util.HashSet; +import java.util.Set; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ProblemSet extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "problem_set_id") + Long id; + + private String name; + private boolean isDeleted; + private boolean isConfirmed; + + @ElementCollection + @CollectionTable(name = "problem_set_problems", joinColumns = @JoinColumn(name = "problem_set_id")) + @Column(name = "problem_id") + private Set problemIds = new HashSet<>(); + + @Builder + public ProblemSet(String name) { + this.name = name; + this.isDeleted = false; + this.isConfirmed = false; + } + +} From b75932c2490201376e7b8a497e8a41f8720c82d0 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sat, 1 Feb 2025 01:00:40 +0900 Subject: [PATCH 02/19] =?UTF-8?q?[feat/#29]=20=EB=B0=9C=ED=96=89=20?= =?UTF-8?q?=EB=A3=A8=ED=8A=B8=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/publish/domain/Publish.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/main/java/com/moplus/moplus_server/domain/publish/domain/Publish.java diff --git a/src/main/java/com/moplus/moplus_server/domain/publish/domain/Publish.java b/src/main/java/com/moplus/moplus_server/domain/publish/domain/Publish.java new file mode 100644 index 0000000..55a66ab --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/publish/domain/Publish.java @@ -0,0 +1,37 @@ +package com.moplus.moplus_server.domain.publish.domain; + +import com.moplus.moplus_server.global.common.BaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import java.time.LocalDate; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Publish extends BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "publish_id") + private Long id; + + @Column(nullable = false) + private LocalDate publishedDate; + + @Column(name = "problem_set_id", nullable = false) + private Long problemSetId; + + @Builder + public Publish(LocalDate publishedDate, Long problemSetId) { + this.publishedDate = publishedDate; + this.problemSetId = problemSetId; + } + +} From 6c7a70404cd64534a15f630125fecd020bea07a8 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sat, 1 Feb 2025 01:10:31 +0900 Subject: [PATCH 03/19] =?UTF-8?q?[fix/#29]=20ProblemId=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moplus_server/domain/problemset/domain/ProblemSet.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 e7cc222..64dd964 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,5 +1,6 @@ package com.moplus.moplus_server.domain.problemset.domain; +import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; import com.moplus.moplus_server.global.common.BaseEntity; import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; @@ -34,7 +35,7 @@ public class ProblemSet extends BaseEntity { @ElementCollection @CollectionTable(name = "problem_set_problems", joinColumns = @JoinColumn(name = "problem_set_id")) @Column(name = "problem_id") - private Set problemIds = new HashSet<>(); + private Set problemIds = new HashSet<>(); @Builder public ProblemSet(String name) { From 8795115020c877536c8f49d620041ce43b959f0b Mon Sep 17 00:00:00 2001 From: HongGit Date: Sat, 1 Feb 2025 03:04:33 +0900 Subject: [PATCH 04/19] =?UTF-8?q?[feat/#31]=20=EB=AC=B8=ED=95=AD=20?= =?UTF-8?q?=EC=88=9C=EC=84=9C=20=EB=B3=B4=EC=9E=A5=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/problemset/domain/ProblemSet.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) 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 64dd964..f580d71 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 @@ -5,14 +5,14 @@ import jakarta.persistence.CollectionTable; import jakarta.persistence.Column; import jakarta.persistence.ElementCollection; -import jakarta.persistence.EmbeddedId; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; -import java.util.HashSet; -import java.util.Set; +import jakarta.persistence.OrderColumn; +import java.util.ArrayList; +import java.util.List; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -35,7 +35,8 @@ public class ProblemSet extends BaseEntity { @ElementCollection @CollectionTable(name = "problem_set_problems", joinColumns = @JoinColumn(name = "problem_set_id")) @Column(name = "problem_id") - private Set problemIds = new HashSet<>(); + @OrderColumn(name = "sequence") + private List problemIds = new ArrayList<>(); @Builder public ProblemSet(String name) { @@ -44,4 +45,8 @@ public ProblemSet(String name) { this.isConfirmed = false; } + public void updateProblemOrder(List newProblems) { + this.problemIds.clear(); + this.problemIds.addAll(newProblems); + } } From 42953409be3129508f05d2258dc1b40d2146a191 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sat, 1 Feb 2025 03:05:06 +0900 Subject: [PATCH 05/19] =?UTF-8?q?[feat/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=83=9D=EC=84=B1=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProblemSetController.java | 27 ++++++++++++++ .../dto/request/ProblemSetPostRequest.java | 15 ++++++++ .../repository/ProblemSetRepository.java | 8 +++++ .../service/ProblemSetSaveService.java | 35 +++++++++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java create mode 100644 src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetPostRequest.java create mode 100644 src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetRepository.java create mode 100644 src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetSaveService.java diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java b/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java new file mode 100644 index 0000000..09b4752 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java @@ -0,0 +1,27 @@ +package com.moplus.moplus_server.domain.problemset.controller; + +import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetPostRequest; +import com.moplus.moplus_server.domain.problemset.service.ProblemSetSaveService; +import io.swagger.v3.oas.annotations.Operation; +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; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/problemSet") +@RequiredArgsConstructor +public class ProblemSetController { + + private final ProblemSetSaveService problemSetSaveService; + + @PostMapping("") + @Operation(summary = "문항세트 생성", description = "세트를 생성합니다. 문항은 요청 순서대로 저장합니다.") + public ResponseEntity createProblemSet( + @RequestBody ProblemSetPostRequest request + ) { + return ResponseEntity.ok(problemSetSaveService.createProblemSet(request)); + } +} 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 new file mode 100644 index 0000000..01ff421 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetPostRequest.java @@ -0,0 +1,15 @@ +package com.moplus.moplus_server.domain.problemset.dto.request; + +import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; +import java.util.List; + +public record ProblemSetPostRequest( + String problemSetName, + List problems +) { + public ProblemSet toEntity(String problemSetName) { + return ProblemSet.builder() + .name(problemSetName) + .build(); + } +} diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetRepository.java b/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetRepository.java new file mode 100644 index 0000000..4027a07 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetRepository.java @@ -0,0 +1,8 @@ +package com.moplus.moplus_server.domain.problemset.repository; + +import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ProblemSetRepository extends JpaRepository { + +} 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 new file mode 100644 index 0000000..054a0e0 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetSaveService.java @@ -0,0 +1,35 @@ +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.repository.ProblemRepository; +import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; +import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetPostRequest; +import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; +import java.util.List; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ProblemSetSaveService { + + private final ProblemSetRepository problemSetRepository; + private final ProblemRepository problemRepository; + + @Transactional + public Long createProblemSet(ProblemSetPostRequest request) { + // 문제 ID 리스트를 ProblemId 객체로 변환 + List problemIdList = request.problems().stream() + .map(ProblemId::new) + .toList(); + + // 모든 문항이 DB에 존재하는지 검증 + problemIdList.forEach(problemRepository::findByIdElseThrow); + + // ProblemSet 생성 + ProblemSet problemSet = request.toEntity(request.problemSetName()); + + return problemSetRepository.save(problemSet).getId(); + } +} From 979177b250afbae70a6f9f6b4234507a344ccb94 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sat, 1 Feb 2025 03:18:06 +0900 Subject: [PATCH 06/19] =?UTF-8?q?[feat/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=EB=AC=B8=ED=95=AD=20=EC=88=9C=EC=84=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProblemSetController.java | 14 +++++++++++++- .../dto/request/ProblemReorderRequest.java | 8 ++++++++ .../repository/ProblemSetRepository.java | 6 ++++++ .../problemset/service/ProblemSetSaveService.java | 14 ++++++++++++++ .../global/error/exception/ErrorCode.java | 3 +++ 5 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemReorderRequest.java diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java b/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java index 09b4752..5422a98 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java @@ -1,11 +1,14 @@ package com.moplus.moplus_server.domain.problemset.controller; +import com.moplus.moplus_server.domain.problemset.dto.request.ProblemReorderRequest; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetPostRequest; import com.moplus.moplus_server.domain.problemset.service.ProblemSetSaveService; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -18,10 +21,19 @@ public class ProblemSetController { private final ProblemSetSaveService problemSetSaveService; @PostMapping("") - @Operation(summary = "문항세트 생성", description = "세트를 생성합니다. 문항은 요청 순서대로 저장합니다.") + @Operation(summary = "문항세트 생성", description = "문항세트를 생성합니다. 문항은 요청 순서대로 저장합니다.") public ResponseEntity createProblemSet( @RequestBody ProblemSetPostRequest request ) { return ResponseEntity.ok(problemSetSaveService.createProblemSet(request)); } + + @PutMapping("/{problemSetId}/sequence") + @Operation(summary = "세트 문항순서 변경", description = "문항세트 내의 문항 리스트의 순서를 변경합니다.") + public ResponseEntity reorderProblems( + @PathVariable Long problemSetId, + @RequestBody ProblemReorderRequest problemReorderRequest) { + problemSetSaveService.reorderProblems(problemSetId, problemReorderRequest); + return ResponseEntity.noContent().build(); + } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemReorderRequest.java b/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemReorderRequest.java new file mode 100644 index 0000000..602b249 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemReorderRequest.java @@ -0,0 +1,8 @@ +package com.moplus.moplus_server.domain.problemset.dto.request; + +import java.util.List; + +public record ProblemReorderRequest( + List newProblems +) { +} diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetRepository.java b/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetRepository.java index 4027a07..fff031f 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetRepository.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/repository/ProblemSetRepository.java @@ -1,8 +1,14 @@ package com.moplus.moplus_server.domain.problemset.repository; import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; +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 ProblemSetRepository extends JpaRepository { + default ProblemSet findByIdElseThrow(Long problemSetId) { + return findById(problemSetId).orElseThrow(() -> new NotFoundException(ErrorCode.PROBLEM_SET_NOT_FOUND)); + } + } 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 054a0e0..365cce6 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 @@ -3,9 +3,11 @@ import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; 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.ProblemReorderRequest; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetPostRequest; import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -32,4 +34,16 @@ public Long createProblemSet(ProblemSetPostRequest request) { return problemSetRepository.save(problemSet).getId(); } + + @Transactional + public void reorderProblems(Long problemSetId, ProblemReorderRequest problemReorderRequest) { + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); + + // 기존 문항 ID 리스트 업데이트 (순서 반영) + List updatedProblemIds = problemReorderRequest.newProblems().stream() + .map(ProblemId::new) + .collect(Collectors.toList()); + + problemSet.updateProblemOrder(updatedProblemIds); + } } 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 eb740fd..1e539bf 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 @@ -52,6 +52,9 @@ public enum ErrorCode { //회원 MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 회원을 찾을 수 없습니다"), + + //문항세트 + PROBLEM_SET_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 문항세트를 찾을 수 없습니다"), ; From 0736230b665f22046d0e33ea8ed6610931965559 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sat, 1 Feb 2025 03:32:53 +0900 Subject: [PATCH 07/19] =?UTF-8?q?[feat/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95,=20=EC=82=AD=EC=A0=9C,=20?= =?UTF-8?q?=EC=BB=A8=ED=8E=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProblemSetController.java | 32 ++++++++++++++++-- .../domain/problemset/domain/ProblemSet.java | 13 ++++++++ .../dto/request/ProblemSetUpdateRequest.java | 9 +++++ .../service/ProblemSetSaveService.java | 33 +++++++++++++++++-- 4 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetUpdateRequest.java diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java b/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java index 5422a98..3874977 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java @@ -2,10 +2,12 @@ import com.moplus.moplus_server.domain.problemset.dto.request.ProblemReorderRequest; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetPostRequest; +import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetUpdateRequest; import com.moplus.moplus_server.domain.problemset.service.ProblemSetSaveService; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; @@ -32,8 +34,34 @@ public ResponseEntity createProblemSet( @Operation(summary = "세트 문항순서 변경", description = "문항세트 내의 문항 리스트의 순서를 변경합니다.") public ResponseEntity reorderProblems( @PathVariable Long problemSetId, - @RequestBody ProblemReorderRequest problemReorderRequest) { - problemSetSaveService.reorderProblems(problemSetId, problemReorderRequest); + @RequestBody ProblemReorderRequest request) { + problemSetSaveService.reorderProblems(problemSetId, request); return ResponseEntity.noContent().build(); } + + @PutMapping("/{problemSetId}") + @Operation(summary = "문항세트 수정", description = "문항세트의 이름 및 문항 리스트를 수정합니다.") + public ResponseEntity updateProblemSet( + @PathVariable Long problemSetId, + @RequestBody ProblemSetUpdateRequest request + ) { + problemSetSaveService.updateProblemSet(problemSetId, request); + return ResponseEntity.noContent().build(); + } + + @DeleteMapping("/{problemSetId}") + @Operation(summary = "문항세트 삭제", description = "문항세트를 삭제합니다. (soft delete)") + public ResponseEntity deleteProblemSet( + @PathVariable Long problemSetId + ) { + problemSetSaveService.deleteProblemSet(problemSetId); + return ResponseEntity.noContent().build(); + } + + @PutMapping("/{problemSetId}/confirm") + @Operation(summary = "문항세트 컨펌 토글", description = "문항세트의 컨펌 상태를 토글합니다.") + public ResponseEntity toggleConfirmProblemSet(@PathVariable Long problemSetId) { + boolean updatedState = problemSetSaveService.toggleConfirmProblemSet(problemSetId); + return ResponseEntity.ok(updatedState); + } } 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 f580d71..d45cc27 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 @@ -49,4 +49,17 @@ public void updateProblemOrder(List newProblems) { this.problemIds.clear(); this.problemIds.addAll(newProblems); } + + public void deleteProblemSet() { + this.isDeleted = true; + } + + public void toggleConfirm(boolean isConfirmed) { + this.isConfirmed = isConfirmed; + } + + public void updateProblemSet(String name, List newProblems) { + this.name = name; + this.problemIds = newProblems; + } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetUpdateRequest.java b/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetUpdateRequest.java new file mode 100644 index 0000000..a0e4745 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/dto/request/ProblemSetUpdateRequest.java @@ -0,0 +1,9 @@ +package com.moplus.moplus_server.domain.problemset.dto.request; + +import java.util.List; + +public record ProblemSetUpdateRequest( + String problemSetName, + List problems +) { +} 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 365cce6..7aadac4 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 @@ -5,6 +5,7 @@ import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemReorderRequest; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetPostRequest; +import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetUpdateRequest; import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; import java.util.List; import java.util.stream.Collectors; @@ -36,14 +37,42 @@ public Long createProblemSet(ProblemSetPostRequest request) { } @Transactional - public void reorderProblems(Long problemSetId, ProblemReorderRequest problemReorderRequest) { + public void reorderProblems(Long problemSetId, ProblemReorderRequest request) { ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); // 기존 문항 ID 리스트 업데이트 (순서 반영) - List updatedProblemIds = problemReorderRequest.newProblems().stream() + List updatedProblemIds = request.newProblems().stream() .map(ProblemId::new) .collect(Collectors.toList()); problemSet.updateProblemOrder(updatedProblemIds); } + + @Transactional + public void updateProblemSet(Long problemSetId, ProblemSetUpdateRequest request) { + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); + + // 문항 리스트 검증 + List problemIdList = request.problems().stream() + .map(ProblemId::new) + .collect(Collectors.toList()); + problemIdList.forEach(problemRepository::findByIdElseThrow); + + problemSet.updateProblemSet(request.problemSetName(), problemIdList); + } + + @Transactional + public void deleteProblemSet(Long problemSetId) { + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); + problemSet.deleteProblemSet(); + } + + @Transactional + public boolean toggleConfirmProblemSet(Long problemSetId) { + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); + + // 현재 상태 반전 (true → false, false → true) + problemSet.toggleConfirm(!problemSet.isConfirmed()); + return problemSet.isConfirmed(); + } } From 182e355aabc361c25d871ed71aae283d8cc19308 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sat, 1 Feb 2025 13:11:16 +0900 Subject: [PATCH 08/19] =?UTF-8?q?[feat/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProblemSetController.java | 12 ++-- .../service/ProblemSetDeleteService.java | 21 +++++++ .../service/ProblemSetSaveService.java | 40 -------------- .../service/ProblemSetUpdateService.java | 55 +++++++++++++++++++ 4 files changed, 84 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetDeleteService.java create mode 100644 src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetUpdateService.java diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java b/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java index 3874977..2af7db8 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java @@ -3,7 +3,9 @@ import com.moplus.moplus_server.domain.problemset.dto.request.ProblemReorderRequest; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetPostRequest; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetUpdateRequest; +import com.moplus.moplus_server.domain.problemset.service.ProblemSetDeleteService; import com.moplus.moplus_server.domain.problemset.service.ProblemSetSaveService; +import com.moplus.moplus_server.domain.problemset.service.ProblemSetUpdateService; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -21,6 +23,8 @@ public class ProblemSetController { private final ProblemSetSaveService problemSetSaveService; + private final ProblemSetUpdateService problemSetUpdateService; + private final ProblemSetDeleteService problemSetDeleteService; @PostMapping("") @Operation(summary = "문항세트 생성", description = "문항세트를 생성합니다. 문항은 요청 순서대로 저장합니다.") @@ -35,7 +39,7 @@ public ResponseEntity createProblemSet( public ResponseEntity reorderProblems( @PathVariable Long problemSetId, @RequestBody ProblemReorderRequest request) { - problemSetSaveService.reorderProblems(problemSetId, request); + problemSetUpdateService.reorderProblems(problemSetId, request); return ResponseEntity.noContent().build(); } @@ -45,7 +49,7 @@ public ResponseEntity updateProblemSet( @PathVariable Long problemSetId, @RequestBody ProblemSetUpdateRequest request ) { - problemSetSaveService.updateProblemSet(problemSetId, request); + problemSetUpdateService.updateProblemSet(problemSetId, request); return ResponseEntity.noContent().build(); } @@ -54,14 +58,14 @@ public ResponseEntity updateProblemSet( public ResponseEntity deleteProblemSet( @PathVariable Long problemSetId ) { - problemSetSaveService.deleteProblemSet(problemSetId); + problemSetDeleteService.deleteProblemSet(problemSetId); return ResponseEntity.noContent().build(); } @PutMapping("/{problemSetId}/confirm") @Operation(summary = "문항세트 컨펌 토글", description = "문항세트의 컨펌 상태를 토글합니다.") public ResponseEntity toggleConfirmProblemSet(@PathVariable Long problemSetId) { - boolean updatedState = problemSetSaveService.toggleConfirmProblemSet(problemSetId); + boolean updatedState = problemSetUpdateService.toggleConfirmProblemSet(problemSetId); return ResponseEntity.ok(updatedState); } } diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetDeleteService.java b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetDeleteService.java new file mode 100644 index 0000000..830d751 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetDeleteService.java @@ -0,0 +1,21 @@ +package com.moplus.moplus_server.domain.problemset.service; + +import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; +import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ProblemSetDeleteService { + + private final ProblemSetRepository problemSetRepository; + + @Transactional + public void deleteProblemSet(Long problemSetId) { + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); + problemSet.deleteProblemSet(); + } + +} \ No newline at end of file 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 7aadac4..10063ac 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 @@ -35,44 +35,4 @@ public Long createProblemSet(ProblemSetPostRequest request) { return problemSetRepository.save(problemSet).getId(); } - - @Transactional - public void reorderProblems(Long problemSetId, ProblemReorderRequest request) { - ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); - - // 기존 문항 ID 리스트 업데이트 (순서 반영) - List updatedProblemIds = request.newProblems().stream() - .map(ProblemId::new) - .collect(Collectors.toList()); - - problemSet.updateProblemOrder(updatedProblemIds); - } - - @Transactional - public void updateProblemSet(Long problemSetId, ProblemSetUpdateRequest request) { - ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); - - // 문항 리스트 검증 - List problemIdList = request.problems().stream() - .map(ProblemId::new) - .collect(Collectors.toList()); - problemIdList.forEach(problemRepository::findByIdElseThrow); - - problemSet.updateProblemSet(request.problemSetName(), problemIdList); - } - - @Transactional - public void deleteProblemSet(Long problemSetId) { - ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); - problemSet.deleteProblemSet(); - } - - @Transactional - public boolean toggleConfirmProblemSet(Long problemSetId) { - ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); - - // 현재 상태 반전 (true → false, false → true) - problemSet.toggleConfirm(!problemSet.isConfirmed()); - return problemSet.isConfirmed(); - } } 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 new file mode 100644 index 0000000..8b46030 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/service/ProblemSetUpdateService.java @@ -0,0 +1,55 @@ +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.repository.ProblemRepository; +import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; +import com.moplus.moplus_server.domain.problemset.dto.request.ProblemReorderRequest; +import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetUpdateRequest; +import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; +import java.util.List; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class ProblemSetUpdateService { + + private final ProblemSetRepository problemSetRepository; + private final ProblemRepository problemRepository; + + @Transactional + public void reorderProblems(Long problemSetId, ProblemReorderRequest request) { + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); + + // 기존 문항 ID 리스트 업데이트 (순서 반영) + List updatedProblemIds = request.newProblems().stream() + .map(ProblemId::new) + .collect(Collectors.toList()); + + problemSet.updateProblemOrder(updatedProblemIds); + } + + @Transactional + public void updateProblemSet(Long problemSetId, ProblemSetUpdateRequest request) { + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); + + // 문항 리스트 검증 + List problemIdList = request.problems().stream() + .map(ProblemId::new) + .collect(Collectors.toList()); + problemIdList.forEach(problemRepository::findByIdElseThrow); + + problemSet.updateProblemSet(request.problemSetName(), problemIdList); + } + + @Transactional + public boolean toggleConfirmProblemSet(Long problemSetId) { + ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); + + // 현재 상태 반전 (true → false, false → true) + problemSet.toggleConfirm(!problemSet.isConfirmed()); + return problemSet.isConfirmed(); + } +} From 154e9735f47f0383b444bf666d793b48817f80ff Mon Sep 17 00:00:00 2001 From: HongGit Date: Sun, 2 Feb 2025 17:49:56 +0900 Subject: [PATCH 09/19] =?UTF-8?q?[feat/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=BB=A8=ED=8E=8C=20=EC=8B=9C=20=EB=AC=B8=ED=95=AD?= =?UTF-8?q?=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/problem/domain/problem/Problem.java | 7 +++++++ .../problemset/service/ProblemSetUpdateService.java | 13 +++++++++++++ .../global/error/exception/ErrorCode.java | 1 + 3 files changed, 21 insertions(+) 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 b059bf3..4f4c2e2 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 @@ -120,4 +120,11 @@ public void updateChildProblem(List inputChildProblems) { public void deleteChildProblem(List deleteChildProblems) { childProblems.removeIf(childProblem -> deleteChildProblems.contains(childProblem.getId())); } + + public boolean isValid() { + return answer != null && !answer.getValue().isEmpty() + && conceptTagIds != null && !conceptTagIds.isEmpty() + && mainProblemImageUrl != null && !mainProblemImageUrl.isEmpty() + && mainAnalysisImageUrl != null && !mainAnalysisImageUrl.isEmpty(); + } } 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 8b46030..b050265 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,11 +1,14 @@ 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.repository.ProblemRepository; import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemReorderRequest; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetUpdateRequest; import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; +import com.moplus.moplus_server.global.error.exception.ErrorCode; +import com.moplus.moplus_server.global.error.exception.InvalidValueException; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -48,8 +51,18 @@ public void updateProblemSet(Long problemSetId, ProblemSetUpdateRequest request) public boolean toggleConfirmProblemSet(Long problemSetId) { ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); + // 문항 유효성 검사 + for (ProblemId problemId : problemSet.getProblemIds()) { + Problem problem = problemRepository.findByIdElseThrow(problemId); + + if (!problem.isValid()) { + throw new InvalidValueException(ErrorCode.INVALID_CONFIRM_PROBLEM); + } + } + // 현재 상태 반전 (true → false, false → true) problemSet.toggleConfirm(!problemSet.isConfirmed()); return problemSet.isConfirmed(); } + } 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 1e539bf..93516b5 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 @@ -32,6 +32,7 @@ public enum ErrorCode { PROBLEM_ALREADY_EXIST(HttpStatus.CONFLICT, "해당 문제는 이미 존재합니다"), INVALID_MULTIPLE_CHOICE_ANSWER(HttpStatus.BAD_REQUEST, "객관식 문제의 정답은 1~5 사이의 숫자여야 합니다"), INVALID_SHORT_NUMBER_ANSWER(HttpStatus.BAD_REQUEST, "주관식 문제의 정답은 0~999 사이의 숫자여야 합니다"), + INVALID_CONFIRM_PROBLEM(HttpStatus.BAD_REQUEST, "문항의 모든 요소를 등록해야 컨펌을 완료할 수 있습니다."), //새끼 문항 CHILD_PROBLEM_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 새끼 문제를 찾을 수 없습니다"), From 48d1cb66dc3409fa32b7cc833a11aca99873c3b9 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sun, 2 Feb 2025 17:51:40 +0900 Subject: [PATCH 10/19] =?UTF-8?q?[fix/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=83=9D=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/problemset/dto/request/ProblemSetPostRequest.java | 4 ++-- .../domain/problemset/service/ProblemSetSaveService.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 01ff421..ef31ed2 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 @@ -7,9 +7,9 @@ public record ProblemSetPostRequest( String problemSetName, List problems ) { - public ProblemSet toEntity(String problemSetName) { + public ProblemSet toEntity() { return ProblemSet.builder() - .name(problemSetName) + .name(this.problemSetName) .build(); } } 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 10063ac..084257a 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 @@ -31,7 +31,7 @@ public Long createProblemSet(ProblemSetPostRequest request) { problemIdList.forEach(problemRepository::findByIdElseThrow); // ProblemSet 생성 - ProblemSet problemSet = request.toEntity(request.problemSetName()); + ProblemSet problemSet = request.toEntity(); return problemSetRepository.save(problemSet).getId(); } From cfb450813ed960cc25007d1987a77bb3aea159f8 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sun, 2 Feb 2025 18:38:45 +0900 Subject: [PATCH 11/19] =?UTF-8?q?[feat/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=BB=A8=ED=8E=8C=20=EC=8B=9C=20=EC=BB=A8=ED=8E=8C?= =?UTF-8?q?=EC=83=81=ED=83=9C=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ProblemSetController.java | 6 +++--- .../domain/problemset/domain/ProblemSet.java | 16 ++++++++++++---- .../domain/ProblemSetConfirmStatus.java | 6 ++++++ .../service/ProblemSetUpdateService.java | 9 ++++----- 4 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSetConfirmStatus.java diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java b/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java index 2af7db8..d101b45 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/controller/ProblemSetController.java @@ -1,5 +1,6 @@ package com.moplus.moplus_server.domain.problemset.controller; +import com.moplus.moplus_server.domain.problemset.domain.ProblemSetConfirmStatus; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemReorderRequest; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetPostRequest; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetUpdateRequest; @@ -64,8 +65,7 @@ public ResponseEntity deleteProblemSet( @PutMapping("/{problemSetId}/confirm") @Operation(summary = "문항세트 컨펌 토글", description = "문항세트의 컨펌 상태를 토글합니다.") - public ResponseEntity toggleConfirmProblemSet(@PathVariable Long problemSetId) { - boolean updatedState = problemSetUpdateService.toggleConfirmProblemSet(problemSetId); - return ResponseEntity.ok(updatedState); + public ResponseEntity toggleConfirmProblemSet(@PathVariable Long problemSetId) { + return ResponseEntity.ok(problemSetUpdateService.toggleConfirmProblemSet(problemSetId)); } } 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 d45cc27..4689315 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 @@ -6,6 +6,8 @@ import jakarta.persistence.Column; import jakarta.persistence.ElementCollection; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; @@ -30,7 +32,9 @@ public class ProblemSet extends BaseEntity { private String name; private boolean isDeleted; - private boolean isConfirmed; + + @Enumerated(EnumType.STRING) + private ProblemSetConfirmStatus confirmStatus; @ElementCollection @CollectionTable(name = "problem_set_problems", joinColumns = @JoinColumn(name = "problem_set_id")) @@ -42,7 +46,7 @@ public class ProblemSet extends BaseEntity { public ProblemSet(String name) { this.name = name; this.isDeleted = false; - this.isConfirmed = false; + this.confirmStatus = ProblemSetConfirmStatus.NOT_CONFIRMED; } public void updateProblemOrder(List newProblems) { @@ -54,8 +58,12 @@ public void deleteProblemSet() { this.isDeleted = true; } - public void toggleConfirm(boolean isConfirmed) { - this.isConfirmed = isConfirmed; + public void toggleConfirm() { + if (this.confirmStatus == ProblemSetConfirmStatus.CONFIRMED) { + this.confirmStatus = ProblemSetConfirmStatus.NOT_CONFIRMED; + } else { + this.confirmStatus = ProblemSetConfirmStatus.CONFIRMED; + } } public void updateProblemSet(String name, List newProblems) { diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSetConfirmStatus.java b/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSetConfirmStatus.java new file mode 100644 index 0000000..7dec452 --- /dev/null +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSetConfirmStatus.java @@ -0,0 +1,6 @@ +package com.moplus.moplus_server.domain.problemset.domain; + +public enum ProblemSetConfirmStatus { + CONFIRMED, + NOT_CONFIRMED +} 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 b050265..a7c95f5 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 @@ -4,6 +4,7 @@ import com.moplus.moplus_server.domain.problem.domain.problem.ProblemId; 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; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemReorderRequest; import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetUpdateRequest; import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; @@ -48,7 +49,7 @@ public void updateProblemSet(Long problemSetId, ProblemSetUpdateRequest request) } @Transactional - public boolean toggleConfirmProblemSet(Long problemSetId) { + public ProblemSetConfirmStatus toggleConfirmProblemSet(Long problemSetId) { ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); // 문항 유효성 검사 @@ -60,9 +61,7 @@ public boolean toggleConfirmProblemSet(Long problemSetId) { } } - // 현재 상태 반전 (true → false, false → true) - problemSet.toggleConfirm(!problemSet.isConfirmed()); - return problemSet.isConfirmed(); + problemSet.toggleConfirm(); + return problemSet.getConfirmStatus(); } - } From 16fd5d571ef6dba33aec3a60ddde77a7a1ce530a Mon Sep 17 00:00:00 2001 From: HongGit Date: Sun, 2 Feb 2025 19:08:15 +0900 Subject: [PATCH 12/19] =?UTF-8?q?[fix/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/problem/domain/problem/Problem.java | 8 ++++++-- .../domain/problemset/domain/ProblemSet.java | 6 +++--- .../problemset/dto/request/ProblemSetPostRequest.java | 4 +++- .../domain/problemset/service/ProblemSetSaveService.java | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) 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 4f4c2e2..e8c7814 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 @@ -123,8 +123,12 @@ public void deleteChildProblem(List deleteChildProblems) { public boolean isValid() { return answer != null && !answer.getValue().isEmpty() - && conceptTagIds != null && !conceptTagIds.isEmpty() + && practiceTestId != null + && comment != null && !comment.isEmpty() + && readingTipImageUrl != null && !readingTipImageUrl.isEmpty() + && seniorTipImageUrl != null && !seniorTipImageUrl.isEmpty() + && prescriptionImageUrl != null && !prescriptionImageUrl.isEmpty() && mainProblemImageUrl != null && !mainProblemImageUrl.isEmpty() && mainAnalysisImageUrl != null && !mainAnalysisImageUrl.isEmpty(); } -} +} \ No newline at end of file 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 4689315..f5f1bf2 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 @@ -43,15 +43,15 @@ public class ProblemSet extends BaseEntity { private List problemIds = new ArrayList<>(); @Builder - public ProblemSet(String name) { + public ProblemSet(String name, List problemIds) { this.name = name; this.isDeleted = false; this.confirmStatus = ProblemSetConfirmStatus.NOT_CONFIRMED; + this.problemIds = problemIds; } public void updateProblemOrder(List newProblems) { - this.problemIds.clear(); - this.problemIds.addAll(newProblems); + this.problemIds = new ArrayList<>(newProblems); } public void deleteProblemSet() { 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 ef31ed2..0401915 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,5 +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.problemset.domain.ProblemSet; import java.util.List; @@ -7,9 +8,10 @@ public record ProblemSetPostRequest( String problemSetName, List problems ) { - public ProblemSet toEntity() { + public ProblemSet toEntity(List problemIdList) { return ProblemSet.builder() .name(this.problemSetName) + .problemIds(problemIdList) .build(); } } 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 084257a..3805f6e 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 @@ -31,7 +31,7 @@ public Long createProblemSet(ProblemSetPostRequest request) { problemIdList.forEach(problemRepository::findByIdElseThrow); // ProblemSet 생성 - ProblemSet problemSet = request.toEntity(); + ProblemSet problemSet = request.toEntity(problemIdList); return problemSetRepository.save(problemSet).getId(); } From a0414727e62ed879655e790edf845c91a543cba5 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sun, 2 Feb 2025 19:08:35 +0900 Subject: [PATCH 13/19] =?UTF-8?q?[test/#31]=20=EB=AC=B8=ED=95=AD=20?= =?UTF-8?q?=EC=84=B8=ED=8A=B8=20=EC=84=9C=EB=B9=84=EC=8A=A4=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../problemset/ProblemSetServiceTest.java | 147 ++++++++++++++++++ src/test/resources/insert-problemset.sql | 40 +++++ 2 files changed, 187 insertions(+) create mode 100644 src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java create mode 100644 src/test/resources/insert-problemset.sql diff --git a/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java b/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java new file mode 100644 index 0000000..cf36fe8 --- /dev/null +++ b/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java @@ -0,0 +1,147 @@ +package com.moplus.moplus_server.domain.problemset; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +import com.moplus.moplus_server.domain.problemset.domain.ProblemSet; +import com.moplus.moplus_server.domain.problemset.domain.ProblemSetConfirmStatus; +import com.moplus.moplus_server.domain.problemset.dto.request.ProblemReorderRequest; +import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetPostRequest; +import com.moplus.moplus_server.domain.problemset.dto.request.ProblemSetUpdateRequest; +import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; +import com.moplus.moplus_server.domain.problemset.service.ProblemSetSaveService; +import com.moplus.moplus_server.domain.problemset.service.ProblemSetUpdateService; +import com.moplus.moplus_server.global.error.exception.ErrorCode; +import com.moplus.moplus_server.global.error.exception.InvalidValueException; +import java.util.List; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.Rollback; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.transaction.annotation.Transactional; + +@Transactional +@ActiveProfiles("h2test") +@Sql({"/insert-problemset.sql"}) +@SpringBootTest +public class ProblemSetServiceTest { + + @Autowired + private ProblemSetSaveService problemSetSaveService; + + @Autowired + private ProblemSetUpdateService problemSetUpdateService; + + @Autowired + private ProblemSetRepository problemSetRepository; + + private ProblemSetPostRequest problemSetPostRequest; + + @BeforeEach + void setUp() { + // 초기 문항 세트 생성 요청 데이터 준비 + problemSetPostRequest = new ProblemSetPostRequest( + "초기 문항세트", + List.of("24052001001", "24052001002", "24052001003") + ); + } + + @Test + @Rollback(false) + void 문항세트_생성_테스트() { + // when + Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest); + + // then + ProblemSet savedProblemSet = problemSetRepository.findById(problemSetId) + .orElseThrow(() -> new IllegalArgumentException("문항세트를 찾을 수 없습니다.")); + + assertThat(savedProblemSet).isNotNull(); + assertThat(savedProblemSet.getName()).isEqualTo("초기 문항세트"); + assertThat(savedProblemSet.getProblemIds()).hasSize(3); + assertThat(savedProblemSet.getProblemIds().get(0).getId()).isEqualTo("24052001001"); + assertThat(savedProblemSet.getProblemIds().get(1).getId()).isEqualTo("24052001002"); + assertThat(savedProblemSet.getProblemIds().get(2).getId()).isEqualTo("24052001003"); + } + + @Test + @Rollback(true) + void 문항세트_문항순서_변경_테스트() { + // given + Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest); + + // when + ProblemReorderRequest reorderRequest = new ProblemReorderRequest( + List.of("24052001003", "24052001001", "24052001002") + ); + problemSetUpdateService.reorderProblems(problemSetId, reorderRequest); + + // then + ProblemSet updatedProblemSet = problemSetRepository.findById(problemSetId) + .orElseThrow(() -> new IllegalArgumentException("문항세트를 찾을 수 없습니다.")); + + assertThat(updatedProblemSet.getProblemIds().get(0).getId()).isEqualTo("24052001003"); + assertThat(updatedProblemSet.getProblemIds().get(1).getId()).isEqualTo("24052001001"); + assertThat(updatedProblemSet.getProblemIds().get(2).getId()).isEqualTo("24052001002"); + } + + @Test + @Rollback(true) + void 문항세트_업데이트_테스트() { + // given + Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest); + + // when + ProblemSetUpdateRequest updateRequest = new ProblemSetUpdateRequest( + "업데이트된 문항세트", + List.of("24052001002", "24052001003") + ); + problemSetUpdateService.updateProblemSet(problemSetId, updateRequest); + + // then + ProblemSet updatedProblemSet = problemSetRepository.findById(problemSetId) + .orElseThrow(() -> new IllegalArgumentException("문항세트를 찾을 수 없습니다.")); + + assertThat(updatedProblemSet.getName()).isEqualTo("업데이트된 문항세트"); + assertThat(updatedProblemSet.getProblemIds()).hasSize(2); + assertThat(updatedProblemSet.getProblemIds().get(0).getId()).isEqualTo("24052001002"); + assertThat(updatedProblemSet.getProblemIds().get(1).getId()).isEqualTo("24052001003"); + } + + @Test + @Rollback(true) + void 문항세트_컨펌_토글_테스트() { + // given + Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest); + + // when + ProblemSetConfirmStatus firstToggleStatus = problemSetUpdateService.toggleConfirmProblemSet(problemSetId); // CONFIRMED + ProblemSetConfirmStatus secondToggleStatus = problemSetUpdateService.toggleConfirmProblemSet(problemSetId); // NOT_CONFIRMED + + // then + assertThat(firstToggleStatus).isEqualTo(ProblemSetConfirmStatus.CONFIRMED); // 첫 번째 호출 후 컨펌 상태 확인 + assertThat(secondToggleStatus).isEqualTo(ProblemSetConfirmStatus.NOT_CONFIRMED); // 두 번째 호출 후 비컨펌 상태 확인 + } + + @Test + @Rollback(true) + void 유효하지_않은_문항이_포함된_문항세트_컨펌_실패_테스트() { + // given + Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest); + + // 유효하지 않은 문항을 포함하도록 설정 (문항 ID가 존재하지 않거나 필수 필드가 누락된 경우) + ProblemSetUpdateRequest invalidUpdateRequest = new ProblemSetUpdateRequest( + "유효하지 않은 문항세트", + List.of("24052001001", "24052001004") + ); + problemSetUpdateService.updateProblemSet(problemSetId, invalidUpdateRequest); + + // when & then + assertThatThrownBy(() -> problemSetUpdateService.toggleConfirmProblemSet(problemSetId)) + .isInstanceOf(InvalidValueException.class) + .hasMessageContaining(ErrorCode.INVALID_CONFIRM_PROBLEM.getMessage()); + } +} \ No newline at end of file diff --git a/src/test/resources/insert-problemset.sql b/src/test/resources/insert-problemset.sql new file mode 100644 index 0000000..eefeac1 --- /dev/null +++ b/src/test/resources/insert-problemset.sql @@ -0,0 +1,40 @@ +DELETE FROM practice_test_tag; +DELETE FROM concept_tag; +DELETE FROM problem; +DELETE FROM practice_test; -- practice_test 데이터도 삭제 + +-- practice_test 데이터 삽입 +INSERT INTO practice_test (practice_test_id, publication_year, subject, name, provider, round, average_solving_time, solves_count, view_count) +VALUES (1, 2024, '고1', '2024 5월 고1 모의고사', '교육청', '1', 60, 100, 1000); + +-- practice-test-tag 데이터 삽입 +INSERT INTO practice_test_tag (id, test_year, test_month, subject) +VALUES (1, 2024, 5, '고1'); + +-- concept-tag 데이터 삽입 +INSERT INTO concept_tag (concept_tag_id, name) +VALUES (1, '미적분'), + (2, '기하'), + (3, '확통'); + +-- problem 데이터 삽입 +INSERT INTO problem (problem_id, practice_test_id, number, answer, comment, main_problem_image_url, + main_analysis_image_url, reading_tip_image_url, senior_tip_image_url, prescription_image_url, + is_published, is_variation) +VALUES ('24052001001', 1, 1, '1', '기존 문제 설명', + 'mainProblem.png', 'mainAnalysis.png', 'readingTip.png', 'seniorTip.png', 'prescription.png', + false, false), + ('24052001002', 1, 2, '2', '문제 2 설명', + 'mainProblem2.png', 'mainAnalysis2.png', 'readingTip2.png', 'seniorTip2.png', 'prescription2.png', + false, false), + ('24052001003', 1, 3, '3', '문제 3 설명', + 'mainProblem3.png', 'mainAnalysis3.png', 'readingTip3.png', 'seniorTip3.png', 'prescription3.png', + false, false); + +-- 유효하지 않은 문제 데이터 삽입 (answer와 mainProblemImageUrl이 NULL) +INSERT INTO problem (problem_id, practice_test_id, number, answer, comment, main_problem_image_url, + main_analysis_image_url, reading_tip_image_url, senior_tip_image_url, prescription_image_url, + is_published, is_variation) +VALUES ('24052001004', 1, 4, NULL, '유효하지 않은 문제 설명', + NULL, 'mainAnalysis4.png', 'readingTip4.png', 'seniorTip4.png', 'prescription4.png', + false, false); \ No newline at end of file From fbf55201a80a003d8d217ddffbd44c5827d4e80b Mon Sep 17 00:00:00 2001 From: HongGit Date: Sun, 2 Feb 2025 19:15:48 +0900 Subject: [PATCH 14/19] =?UTF-8?q?[fix/#31]=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EB=AC=B8=ED=95=AD=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20null?= =?UTF-8?q?=EA=B0=92=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/insert-problemset.sql | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/resources/insert-problemset.sql b/src/test/resources/insert-problemset.sql index eefeac1..64e7fe8 100644 --- a/src/test/resources/insert-problemset.sql +++ b/src/test/resources/insert-problemset.sql @@ -35,6 +35,6 @@ VALUES ('24052001001', 1, 1, '1', '기존 문제 설명', INSERT INTO problem (problem_id, practice_test_id, number, answer, comment, main_problem_image_url, main_analysis_image_url, reading_tip_image_url, senior_tip_image_url, prescription_image_url, is_published, is_variation) -VALUES ('24052001004', 1, 4, NULL, '유효하지 않은 문제 설명', - NULL, 'mainAnalysis4.png', 'readingTip4.png', 'seniorTip4.png', 'prescription4.png', +VALUES ('24052001004', 1, 4, '', '유효하지 않은 문제 설명', + '', 'mainAnalysis4.png', 'readingTip4.png', 'seniorTip4.png', 'prescription4.png', false, false); \ No newline at end of file From ffa7cf32e1808386441c8ab9e05ab13ad5c957e3 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sun, 2 Feb 2025 19:20:20 +0900 Subject: [PATCH 15/19] =?UTF-8?q?[fix/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=8B=9C=20=EA=B8=B0?= =?UTF-8?q?=EC=A1=B4=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/insert-problemset.sql | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/test/resources/insert-problemset.sql b/src/test/resources/insert-problemset.sql index 64e7fe8..a68b35b 100644 --- a/src/test/resources/insert-problemset.sql +++ b/src/test/resources/insert-problemset.sql @@ -1,7 +1,9 @@ +DELETE FROM problem_set_problems; +DELETE FROM problem_set; +DELETE FROM problem; DELETE FROM practice_test_tag; DELETE FROM concept_tag; -DELETE FROM problem; -DELETE FROM practice_test; -- practice_test 데이터도 삭제 +DELETE FROM practice_test; -- practice_test 데이터 삽입 INSERT INTO practice_test (practice_test_id, publication_year, subject, name, provider, round, average_solving_time, solves_count, view_count) From d07fbe4e1432ebcefe8944915dd3b68ee4de9fa4 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sun, 2 Feb 2025 19:28:58 +0900 Subject: [PATCH 16/19] =?UTF-8?q?[feat/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=BB=A8=ED=8E=8C=20=EC=83=81=ED=83=9C=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=94=EA=BE=B8=EB=8A=94=20=EA=B2=BD=EC=9A=B0=EB=A7=8C=20?= =?UTF-8?q?=EB=AC=B8=ED=95=AD=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../problemset/service/ProblemSetUpdateService.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 a7c95f5..e606bf0 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 @@ -52,12 +52,14 @@ public void updateProblemSet(Long problemSetId, ProblemSetUpdateRequest request) public ProblemSetConfirmStatus toggleConfirmProblemSet(Long problemSetId) { ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); - // 문항 유효성 검사 - for (ProblemId problemId : problemSet.getProblemIds()) { - Problem problem = problemRepository.findByIdElseThrow(problemId); + if(problemSet.getConfirmStatus() == ProblemSetConfirmStatus.NOT_CONFIRMED){ + // 문항 유효성 검사 + for (ProblemId problemId : problemSet.getProblemIds()) { + Problem problem = problemRepository.findByIdElseThrow(problemId); - if (!problem.isValid()) { - throw new InvalidValueException(ErrorCode.INVALID_CONFIRM_PROBLEM); + if (!problem.isValid()) { + throw new InvalidValueException(ErrorCode.INVALID_CONFIRM_PROBLEM); + } } } From b604b25d01bcde4fe82e4da4c4e388d9cb7ea615 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sun, 2 Feb 2025 19:33:43 +0900 Subject: [PATCH 17/19] =?UTF-8?q?[fix/#31]=20=EB=AC=B8=ED=95=AD=EC=84=B8?= =?UTF-8?q?=ED=8A=B8=20=EC=83=9D=EC=84=B1=20=ED=9B=84=20=EB=A1=A4=EB=B0=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moplus_server/domain/problemset/ProblemSetServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java b/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java index cf36fe8..856cc15 100644 --- a/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java +++ b/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java @@ -50,7 +50,7 @@ void setUp() { } @Test - @Rollback(false) + @Rollback(true) void 문항세트_생성_테스트() { // when Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest); From c67c13f31340891acdaae8e635acfca3962d54b4 Mon Sep 17 00:00:00 2001 From: HongGit Date: Sun, 2 Feb 2025 20:20:31 +0900 Subject: [PATCH 18/19] =?UTF-8?q?[fix/#31]=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=8B=9C=20=EC=97=B0=EA=B4=80=20=ED=85=8C=EC=9D=B4=EB=B8=94?= =?UTF-8?q?=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/resources/insert-problemset.sql | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/src/test/resources/insert-problemset.sql b/src/test/resources/insert-problemset.sql index a68b35b..6e50eca 100644 --- a/src/test/resources/insert-problemset.sql +++ b/src/test/resources/insert-problemset.sql @@ -1,23 +1,11 @@ +DELETE FROM problem_concept; +DELETE +FROM child_problem_concept; +DELETE +FROM child_problem; DELETE FROM problem_set_problems; DELETE FROM problem_set; DELETE FROM problem; -DELETE FROM practice_test_tag; -DELETE FROM concept_tag; -DELETE FROM practice_test; - --- practice_test 데이터 삽입 -INSERT INTO practice_test (practice_test_id, publication_year, subject, name, provider, round, average_solving_time, solves_count, view_count) -VALUES (1, 2024, '고1', '2024 5월 고1 모의고사', '교육청', '1', 60, 100, 1000); - --- practice-test-tag 데이터 삽입 -INSERT INTO practice_test_tag (id, test_year, test_month, subject) -VALUES (1, 2024, 5, '고1'); - --- concept-tag 데이터 삽입 -INSERT INTO concept_tag (concept_tag_id, name) -VALUES (1, '미적분'), - (2, '기하'), - (3, '확통'); -- problem 데이터 삽입 INSERT INTO problem (problem_id, practice_test_id, number, answer, comment, main_problem_image_url, From dc6ee2a873a1d43168f5e60bb4f002a83c5d2fa8 Mon Sep 17 00:00:00 2001 From: HongGit Date: Mon, 3 Feb 2025 22:29:59 +0900 Subject: [PATCH 19/19] =?UTF-8?q?[feat/#31]=20=EB=AC=B8=ED=95=AD=20?= =?UTF-8?q?=ED=86=A0=EA=B8=80=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/problemset/domain/ProblemSet.java | 17 ++++++++++++----- .../domain/ProblemSetConfirmStatus.java | 7 +++++-- .../service/ProblemSetUpdateService.java | 18 ++++++------------ .../problemset/ProblemSetServiceTest.java | 5 ----- 4 files changed, 23 insertions(+), 24 deletions(-) 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 f5f1bf2..4b2e7d9 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,10 @@ 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.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.ElementCollection; @@ -58,12 +61,16 @@ public void deleteProblemSet() { this.isDeleted = true; } - public void toggleConfirm() { - if (this.confirmStatus == ProblemSetConfirmStatus.CONFIRMED) { - this.confirmStatus = ProblemSetConfirmStatus.NOT_CONFIRMED; - } else { - this.confirmStatus = ProblemSetConfirmStatus.CONFIRMED; + public void toggleConfirm(List problems) { + if(this.confirmStatus == ProblemSetConfirmStatus.NOT_CONFIRMED){ + // 문항 유효성 검사 + for (Problem problem : problems) { + if (!problem.isValid()) { + throw new InvalidValueException(ErrorCode.INVALID_CONFIRM_PROBLEM); + } + } } + this.confirmStatus = this.confirmStatus.toggle(); } public void updateProblemSet(String name, List newProblems) { diff --git a/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSetConfirmStatus.java b/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSetConfirmStatus.java index 7dec452..e108d26 100644 --- a/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSetConfirmStatus.java +++ b/src/main/java/com/moplus/moplus_server/domain/problemset/domain/ProblemSetConfirmStatus.java @@ -2,5 +2,8 @@ public enum ProblemSetConfirmStatus { CONFIRMED, - NOT_CONFIRMED -} + NOT_CONFIRMED; + public ProblemSetConfirmStatus toggle() { + return this == CONFIRMED ? NOT_CONFIRMED : CONFIRMED; + } +} \ No newline at end of file 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 e606bf0..fd42a0f 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 @@ -10,6 +10,7 @@ import com.moplus.moplus_server.domain.problemset.repository.ProblemSetRepository; import com.moplus.moplus_server.global.error.exception.ErrorCode; import com.moplus.moplus_server.global.error.exception.InvalidValueException; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -51,19 +52,12 @@ public void updateProblemSet(Long problemSetId, ProblemSetUpdateRequest request) @Transactional public ProblemSetConfirmStatus toggleConfirmProblemSet(Long problemSetId) { ProblemSet problemSet = problemSetRepository.findByIdElseThrow(problemSetId); - - if(problemSet.getConfirmStatus() == ProblemSetConfirmStatus.NOT_CONFIRMED){ - // 문항 유효성 검사 - for (ProblemId problemId : problemSet.getProblemIds()) { - Problem problem = problemRepository.findByIdElseThrow(problemId); - - if (!problem.isValid()) { - throw new InvalidValueException(ErrorCode.INVALID_CONFIRM_PROBLEM); - } - } + List problems = new ArrayList<>(); + for (ProblemId problemId : problemSet.getProblemIds()) { + Problem problem = problemRepository.findByIdElseThrow(problemId); + problems.add(problem); } - - problemSet.toggleConfirm(); + problemSet.toggleConfirm(problems); return problemSet.getConfirmStatus(); } } diff --git a/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java b/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java index 856cc15..e7c95ca 100644 --- a/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java +++ b/src/test/java/com/moplus/moplus_server/domain/problemset/ProblemSetServiceTest.java @@ -50,7 +50,6 @@ void setUp() { } @Test - @Rollback(true) void 문항세트_생성_테스트() { // when Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest); @@ -68,7 +67,6 @@ void setUp() { } @Test - @Rollback(true) void 문항세트_문항순서_변경_테스트() { // given Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest); @@ -89,7 +87,6 @@ void setUp() { } @Test - @Rollback(true) void 문항세트_업데이트_테스트() { // given Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest); @@ -112,7 +109,6 @@ void setUp() { } @Test - @Rollback(true) void 문항세트_컨펌_토글_테스트() { // given Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest); @@ -127,7 +123,6 @@ void setUp() { } @Test - @Rollback(true) void 유효하지_않은_문항이_포함된_문항세트_컨펌_실패_테스트() { // given Long problemSetId = problemSetSaveService.createProblemSet(problemSetPostRequest);