From d48c93963a26dd19aa3800cedb63641825b0a6fa Mon Sep 17 00:00:00 2001 From: Ji Ho June <129824629+ho0010@users.noreply.github.com> Date: Sun, 18 Aug 2024 14:28:49 +0900 Subject: [PATCH 1/2] Feat: getDebate debateImgURL --- .../java/store/itpick/backend/dto/debate/GetDebateResponse.java | 1 + src/main/java/store/itpick/backend/service/DebateService.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/store/itpick/backend/dto/debate/GetDebateResponse.java b/src/main/java/store/itpick/backend/dto/debate/GetDebateResponse.java index a98e696..44a928c 100644 --- a/src/main/java/store/itpick/backend/dto/debate/GetDebateResponse.java +++ b/src/main/java/store/itpick/backend/dto/debate/GetDebateResponse.java @@ -29,6 +29,7 @@ public class GetDebateResponse { private List comments; private boolean userVoted; private String userVoteOptionText; + private String debateImgUrl; @Data @Builder diff --git a/src/main/java/store/itpick/backend/service/DebateService.java b/src/main/java/store/itpick/backend/service/DebateService.java index 1b951eb..855a08a 100644 --- a/src/main/java/store/itpick/backend/service/DebateService.java +++ b/src/main/java/store/itpick/backend/service/DebateService.java @@ -193,6 +193,7 @@ public GetDebateResponse getDebate(Long debateId, String token) { return GetDebateResponse.builder() .debateId(debate.getDebateId()) + .debateImgUrl(debate.getImageUrl()) .title(debate.getTitle()) .content(debate.getContent()) .hits(debate.getHits()) From 857e923b98046b58c87a71cc528dd6796d113ca4 Mon Sep 17 00:00:00 2001 From: Ji Ho June <129824629+ho0010@users.noreply.github.com> Date: Sun, 18 Aug 2024 15:54:47 +0900 Subject: [PATCH 2/2] Feat: vote multipleChoice --- .../status/BaseExceptionResponseStatus.java | 1 + .../backend/dto/debate/GetDebateResponse.java | 1 + .../backend/dto/debate/PostDebateRequest.java | 3 + .../dto/vote/DeleteUserVoteChoiceRequest.java | 4 +- .../dto/vote/PostUserVoteChoiceRequest.java | 4 +- .../backend/dto/vote/PostVoteRequest.java | 1 + .../java/store/itpick/backend/model/Vote.java | 2 + .../repository/UserVoteChoiceRepository.java | 4 +- .../itpick/backend/service/DebateService.java | 9 ++- .../itpick/backend/service/VoteService.java | 58 +++++++++++++------ 10 files changed, 63 insertions(+), 24 deletions(-) diff --git a/src/main/java/store/itpick/backend/common/response/status/BaseExceptionResponseStatus.java b/src/main/java/store/itpick/backend/common/response/status/BaseExceptionResponseStatus.java index a6dd377..50ff7cb 100644 --- a/src/main/java/store/itpick/backend/common/response/status/BaseExceptionResponseStatus.java +++ b/src/main/java/store/itpick/backend/common/response/status/BaseExceptionResponseStatus.java @@ -84,6 +84,7 @@ public enum BaseExceptionResponseStatus implements ResponseStatus { VOTE_OPTION_NOT_FOUND(7002,HttpStatus.BAD_REQUEST.value(), "해당 투표 옵션이 존재하지 않습니다."), INVALID_VOTE_DELETE_VALUE(7003,HttpStatus.BAD_REQUEST.value(), "투표 취소 요청에서 잘못된 값이 존재합니다."), USER_VOTE_CHOICE_NOT_FOUND(7004,HttpStatus.BAD_REQUEST.value(), "투표하지 않았기 때문에 취소할 수 없습니다."), + MULTIPLE_SELECTION_NOT_ALLOWED(7005,HttpStatus.BAD_REQUEST.value(), "복수 투표가 허용되지 않습니다."), diff --git a/src/main/java/store/itpick/backend/dto/debate/GetDebateResponse.java b/src/main/java/store/itpick/backend/dto/debate/GetDebateResponse.java index 44a928c..42fb9a2 100644 --- a/src/main/java/store/itpick/backend/dto/debate/GetDebateResponse.java +++ b/src/main/java/store/itpick/backend/dto/debate/GetDebateResponse.java @@ -30,6 +30,7 @@ public class GetDebateResponse { private boolean userVoted; private String userVoteOptionText; private String debateImgUrl; + private boolean multipleChoice; @Data @Builder diff --git a/src/main/java/store/itpick/backend/dto/debate/PostDebateRequest.java b/src/main/java/store/itpick/backend/dto/debate/PostDebateRequest.java index 0a99a36..28a84df 100644 --- a/src/main/java/store/itpick/backend/dto/debate/PostDebateRequest.java +++ b/src/main/java/store/itpick/backend/dto/debate/PostDebateRequest.java @@ -31,5 +31,8 @@ public class PostDebateRequest { private MultipartFile imageFile; private List voteOptions; + + private boolean multipleChoice; + } diff --git a/src/main/java/store/itpick/backend/dto/vote/DeleteUserVoteChoiceRequest.java b/src/main/java/store/itpick/backend/dto/vote/DeleteUserVoteChoiceRequest.java index 9d02f58..454f3cd 100644 --- a/src/main/java/store/itpick/backend/dto/vote/DeleteUserVoteChoiceRequest.java +++ b/src/main/java/store/itpick/backend/dto/vote/DeleteUserVoteChoiceRequest.java @@ -6,6 +6,8 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + @Data @NoArgsConstructor @AllArgsConstructor @@ -16,5 +18,5 @@ public class DeleteUserVoteChoiceRequest { private Long userId; @NotNull(message = "Vote Option ID는 필수입니다.") - private Long voteOptionId; + private List voteOptionIds; } diff --git a/src/main/java/store/itpick/backend/dto/vote/PostUserVoteChoiceRequest.java b/src/main/java/store/itpick/backend/dto/vote/PostUserVoteChoiceRequest.java index 67ce64f..ad3165d 100644 --- a/src/main/java/store/itpick/backend/dto/vote/PostUserVoteChoiceRequest.java +++ b/src/main/java/store/itpick/backend/dto/vote/PostUserVoteChoiceRequest.java @@ -6,6 +6,8 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + @Data @NoArgsConstructor @AllArgsConstructor @@ -15,5 +17,5 @@ public class PostUserVoteChoiceRequest { private Long userId; @NotNull(message = "Vote Option ID는 필수입니다.") - private Long voteOptionId; + private List voteOptionIds; } diff --git a/src/main/java/store/itpick/backend/dto/vote/PostVoteRequest.java b/src/main/java/store/itpick/backend/dto/vote/PostVoteRequest.java index f2574bf..a9913c2 100644 --- a/src/main/java/store/itpick/backend/dto/vote/PostVoteRequest.java +++ b/src/main/java/store/itpick/backend/dto/vote/PostVoteRequest.java @@ -6,4 +6,5 @@ public class PostVoteRequest { private Long debateId; private Long optionNum; + private boolean multipleChoice; } diff --git a/src/main/java/store/itpick/backend/model/Vote.java b/src/main/java/store/itpick/backend/model/Vote.java index be0b95f..d7d1307 100644 --- a/src/main/java/store/itpick/backend/model/Vote.java +++ b/src/main/java/store/itpick/backend/model/Vote.java @@ -28,6 +28,8 @@ public class Vote { @Column(name = "update_at") private Timestamp updateAt; + @Column(nullable = false) + private boolean multipleChoice = false; @OneToOne @JoinColumn(name = "debate_id", nullable = false) private Debate debate; diff --git a/src/main/java/store/itpick/backend/repository/UserVoteChoiceRepository.java b/src/main/java/store/itpick/backend/repository/UserVoteChoiceRepository.java index 982c2bb..bc39d37 100644 --- a/src/main/java/store/itpick/backend/repository/UserVoteChoiceRepository.java +++ b/src/main/java/store/itpick/backend/repository/UserVoteChoiceRepository.java @@ -6,8 +6,10 @@ import store.itpick.backend.model.Vote; import store.itpick.backend.model.VoteOption; +import java.util.List; + public interface UserVoteChoiceRepository extends JpaRepository { void deleteByVoteOption_VoteAndUser(Vote vote, User user); - UserVoteChoice findByVoteOptionAndUser(VoteOption voteOption,User user); + List findByVoteOptionAndUser(VoteOption voteOption, User user); } diff --git a/src/main/java/store/itpick/backend/service/DebateService.java b/src/main/java/store/itpick/backend/service/DebateService.java index 855a08a..e0871b2 100644 --- a/src/main/java/store/itpick/backend/service/DebateService.java +++ b/src/main/java/store/itpick/backend/service/DebateService.java @@ -64,6 +64,7 @@ public PostDebateResponse createDebate(PostDebateRequest postDebateRequest) { if (voteOptions != null && !voteOptions.isEmpty()) { PostVoteRequest postVoteRequest = new PostVoteRequest(); postVoteRequest.setDebateId(debate.getDebateId()); + postVoteRequest.setMultipleChoice(postDebateRequest.isMultipleChoice()); voteService.createVote(postVoteRequest, postDebateRequest.getVoteOptions()); } @@ -157,10 +158,11 @@ public GetDebateResponse getDebate(Long debateId, String token) { String userVoteOptionText = null; for (VoteOption voteOption : debate.getVote().getVoteOptions()) { - UserVoteChoice userVoteChoice = userVoteChoiceRepository.findByVoteOptionAndUser(voteOption, user); - if (userVoteChoice != null) { + List userVoteChoices = userVoteChoiceRepository.findByVoteOptionAndUser(voteOption, user); + if (!userVoteChoices.isEmpty()) { userVoted = true; - userVoteOptionText = voteOption.getOptionText(); + // 여러 선택지 중 첫 번째 선택된 옵션의 텍스트를 가져옴 (필요에 따라 조정 가능) + userVoteOptionText = userVoteChoices.get(0).getVoteOption().getOptionText(); break; } } @@ -194,6 +196,7 @@ public GetDebateResponse getDebate(Long debateId, String token) { return GetDebateResponse.builder() .debateId(debate.getDebateId()) .debateImgUrl(debate.getImageUrl()) + .multipleChoice(debate.getVote().isMultipleChoice()) .title(debate.getTitle()) .content(debate.getContent()) .hits(debate.getHits()) diff --git a/src/main/java/store/itpick/backend/service/VoteService.java b/src/main/java/store/itpick/backend/service/VoteService.java index d1e6f7d..8e6c6bf 100644 --- a/src/main/java/store/itpick/backend/service/VoteService.java +++ b/src/main/java/store/itpick/backend/service/VoteService.java @@ -43,6 +43,7 @@ public PostVoteResponse createVote(PostVoteRequest postVoteRequest, List new UserException(USER_NOT_FOUND)); - VoteOption voteOption = voteOptionRepository.findById(postUserVoteChoiceRequest.getVoteOptionId()) - .orElseThrow(() -> new VoteException(VOTE_OPTION_NOT_FOUND)); + List voteOptions = voteOptionRepository.findAllById(postUserVoteChoiceRequest.getVoteOptionIds()); - userVoteChoiceRepository.deleteByVoteOption_VoteAndUser(voteOption.getVote(), user); + if (voteOptions.isEmpty()) { + throw new VoteException(VOTE_OPTION_NOT_FOUND); + } - UserVoteChoice userVoteChoice = UserVoteChoice.builder() - .user(user) - .voteOption(voteOption) - .status("active") - .createAt(Timestamp.valueOf(LocalDateTime.now())) - .updateAt(Timestamp.valueOf(LocalDateTime.now())) - .build(); + Vote vote = voteOptions.get(0).getVote(); - userVoteChoiceRepository.save(userVoteChoice); + if (!vote.isMultipleChoice() && postUserVoteChoiceRequest.getVoteOptionIds().size() > 1) { + throw new VoteException(MULTIPLE_SELECTION_NOT_ALLOWED); + } + + userVoteChoiceRepository.deleteByVoteOption_VoteAndUser(vote, user); + + + // 새로운 선택 저장 + for (VoteOption voteOption : voteOptions) { + UserVoteChoice userVoteChoice = UserVoteChoice.builder() + .user(user) + .voteOption(voteOption) + .status("active") + .createAt(Timestamp.valueOf(LocalDateTime.now())) + .updateAt(Timestamp.valueOf(LocalDateTime.now())) + .build(); + + userVoteChoiceRepository.save(userVoteChoice); + } } + @Transactional public void deleteUserVoteChoice(DeleteUserVoteChoiceRequest deleteUserVoteChoiceRequest){ User user = userRepository.findById(deleteUserVoteChoiceRequest.getUserId()) .orElseThrow(() -> new UserException(USER_NOT_FOUND)); - VoteOption voteOption = voteOptionRepository.findById(deleteUserVoteChoiceRequest.getVoteOptionId()) - .orElseThrow(() -> new VoteException(VOTE_OPTION_NOT_FOUND)); + List voteOptionIds = deleteUserVoteChoiceRequest.getVoteOptionIds(); + + for (Long voteOptionId : voteOptionIds) { + VoteOption voteOption = voteOptionRepository.findById(voteOptionId) + .orElseThrow(() -> new VoteException(VOTE_OPTION_NOT_FOUND)); - UserVoteChoice userVoteChoice = userVoteChoiceRepository.findByVoteOptionAndUser(voteOption, user); + List userVoteChoices = userVoteChoiceRepository.findByVoteOptionAndUser(voteOption, user); - if (userVoteChoice != null) { - userVoteChoiceRepository.delete(userVoteChoice); - } else { - throw new VoteException(USER_VOTE_CHOICE_NOT_FOUND); + if (!userVoteChoices.isEmpty()) { + for (UserVoteChoice userVoteChoice : userVoteChoices) { + userVoteChoiceRepository.delete(userVoteChoice); + } + } else { + throw new VoteException(USER_VOTE_CHOICE_NOT_FOUND); + } } } + }