Skip to content

Commit

Permalink
Merge pull request #125 from ho0010/dev
Browse files Browse the repository at this point in the history
Feat: vote multipleChoice
  • Loading branch information
ho0010 authored Aug 18, 2024
2 parents 9b09708 + 857e923 commit 26907cd
Show file tree
Hide file tree
Showing 10 changed files with 65 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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(), "복수 투표가 허용되지 않습니다."),



Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ public class GetDebateResponse {
private List<CommentResponse> comments;
private boolean userVoted;
private String userVoteOptionText;
private String debateImgUrl;
private boolean multipleChoice;

@Data
@Builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,8 @@ public class PostDebateRequest {
private MultipartFile imageFile;

private List<VoteOptionRequest> voteOptions;

private boolean multipleChoice;

}

Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
Expand All @@ -16,5 +18,5 @@ public class DeleteUserVoteChoiceRequest {
private Long userId;

@NotNull(message = "Vote Option ID는 필수입니다.")
private Long voteOptionId;
private List<Long> voteOptionIds;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
@AllArgsConstructor
Expand All @@ -15,5 +17,5 @@ public class PostUserVoteChoiceRequest {
private Long userId;

@NotNull(message = "Vote Option ID는 필수입니다.")
private Long voteOptionId;
private List<Long> voteOptionIds;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
public class PostVoteRequest {
private Long debateId;
private Long optionNum;
private boolean multipleChoice;
}
2 changes: 2 additions & 0 deletions src/main/java/store/itpick/backend/model/Vote.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<UserVoteChoice, Long> {
void deleteByVoteOption_VoteAndUser(Vote vote, User user);
UserVoteChoice findByVoteOptionAndUser(VoteOption voteOption,User user);
List<UserVoteChoice> findByVoteOptionAndUser(VoteOption voteOption, User user);
}

10 changes: 7 additions & 3 deletions src/main/java/store/itpick/backend/service/DebateService.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,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());
}

Expand Down Expand Up @@ -164,10 +165,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<UserVoteChoice> userVoteChoices = userVoteChoiceRepository.findByVoteOptionAndUser(voteOption, user);
if (!userVoteChoices.isEmpty()) {
userVoted = true;
userVoteOptionText = voteOption.getOptionText();
// 여러 선택지 중 첫 번째 선택된 옵션의 텍스트를 가져옴 (필요에 따라 조정 가능)
userVoteOptionText = userVoteChoices.get(0).getVoteOption().getOptionText();
break;
}
}
Expand Down Expand Up @@ -200,6 +202,8 @@ 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())
Expand Down
58 changes: 40 additions & 18 deletions src/main/java/store/itpick/backend/service/VoteService.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public PostVoteResponse createVote(PostVoteRequest postVoteRequest, List<VoteOpt
.createAt(Timestamp.valueOf(LocalDateTime.now()))
.updateAt(Timestamp.valueOf(LocalDateTime.now()))
.debate(debate)
.multipleChoice(postVoteRequest.isMultipleChoice())
.build();

vote = voteRepository.save(vote);
Expand Down Expand Up @@ -80,37 +81,58 @@ public void createUserVoteChoice(PostUserVoteChoiceRequest postUserVoteChoiceReq
User user = userRepository.findById(postUserVoteChoiceRequest.getUserId())
.orElseThrow(() -> new UserException(USER_NOT_FOUND));

VoteOption voteOption = voteOptionRepository.findById(postUserVoteChoiceRequest.getVoteOptionId())
.orElseThrow(() -> new VoteException(VOTE_OPTION_NOT_FOUND));
List<VoteOption> 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<Long> 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<UserVoteChoice> 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);
}
}
}

}

0 comments on commit 26907cd

Please sign in to comment.