Skip to content

Commit

Permalink
Merge pull request #71 from ho0010/dev
Browse files Browse the repository at this point in the history
Feat: UserVoteChoice API
  • Loading branch information
ho0010 authored Aug 11, 2024
2 parents e8b2add + aeaaaba commit 2bca6bb
Show file tree
Hide file tree
Showing 12 changed files with 154 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package store.itpick.backend.common.exception_handler;

import jakarta.annotation.Priority;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import store.itpick.backend.common.exception.VoteException;
import store.itpick.backend.common.response.BaseErrorResponse;

@Slf4j
@Priority(0)
@RestControllerAdvice
public class VoteExceptionControllerAdvice {

@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(VoteException.class)
public BaseErrorResponse handleDebateException(VoteException e) {
log.error("[VoteException]", e);
return new BaseErrorResponse(e.getExceptionStatus());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,9 @@ public enum BaseExceptionResponseStatus implements ResponseStatus {
* 7000: Vote 오류
*/

INVALID_DEBATE_ID(7000,HttpStatus.BAD_REQUEST.value(), "유효하지 않은 DEBATE ID입니다.");


INVALID_DEBATE_ID(7000,HttpStatus.BAD_REQUEST.value(), "유효하지 않은 DEBATE ID입니다."),
INVALID_VOTE_VALUE(7001,HttpStatus.BAD_REQUEST.value(), "투표 요청에서 잘못된 값이 존재합니다."),
VOTE_OPTION_NOT_FOUND(7002,HttpStatus.BAD_REQUEST.value(), "해당 투표 옵션이 존재하지 않습니다.");


private final int code;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Connection;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
Expand All @@ -12,7 +12,9 @@
import store.itpick.backend.common.exception.DebateException;
import store.itpick.backend.common.response.BaseResponse;
import store.itpick.backend.dto.debate.*;
import store.itpick.backend.dto.vote.PostUserVoteChoiceRequest;
import store.itpick.backend.service.DebateService;
import store.itpick.backend.service.VoteService;

import static store.itpick.backend.common.response.status.BaseExceptionResponseStatus.*;
import static store.itpick.backend.util.BindingResultUtils.getErrorMessages;
Expand All @@ -24,6 +26,7 @@
public class DebateController {

private final DebateService debateService;
private final VoteService voteService;

@PostMapping("")
public BaseResponse<PostDebateResponse> createDebate(@Valid @RequestBody PostDebateRequest postDebateRequest, BindingResult bindingResult) {
Expand All @@ -46,11 +49,24 @@ public BaseResponse<PostCommentResponse> createComment(@Valid @RequestBody PostC
}

@PostMapping("/comment/heart")
public BaseResponse<PostCommentHeartResponse> creatCommentHeart(@Valid @RequestBody PostCommentHeartRequest postCommentHeartRequest, BindingResult bindingResult){
public BaseResponse<PostCommentHeartResponse> creatCommentHeart(@Valid @RequestBody PostCommentHeartRequest postCommentHeartRequest, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
throw new DebateException(INVALID_COMMENT_HEART_VALUE, getErrorMessages(bindingResult));
}

return new BaseResponse<>(debateService.creatCommentHeart(postCommentHeartRequest));
}

@PostMapping("/vote")
public BaseResponse<Object> creatUserVoteChoice(@Valid @RequestBody PostUserVoteChoiceRequest postUserVoteChoiceRequest, BindingResult bindingResult) {


if (bindingResult.hasErrors()) {
throw new DebateException(INVALID_VOTE_VALUE, getErrorMessages(bindingResult));
}

voteService.createUserVoteChoice(postUserVoteChoiceRequest);

return new BaseResponse<>(HttpStatus.OK);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package store.itpick.backend.dto.vote;

import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class PostUserVoteChoiceRequest {
@NotNull(message = "User ID는 필수입니다.")
private Long userId;

@NotNull(message = "Vote Option ID는 필수입니다.")
private Long voteOptionId;
}
3 changes: 3 additions & 0 deletions src/main/java/store/itpick/backend/model/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,7 @@ public class User {

@OneToMany(mappedBy = "user")
private List<CommentHeart> commentHearts;

@OneToMany(mappedBy = "user")
private List<UserVoteChoice> userVoteChoices;
}
41 changes: 41 additions & 0 deletions src/main/java/store/itpick/backend/model/UserVoteChoice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package store.itpick.backend.model;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.sql.Timestamp;

@Entity
@Table(name = "user_vote_choice")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class UserVoteChoice {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_vote_choice_id")
private Long UserVoteChoiceId;

@Column(name = "status", nullable = false, length = 20)
private String status;

@Column(name = "create_at", nullable = false)
private Timestamp createAt;

@Column(name = "update_at")
private Timestamp updateAt;

@ManyToOne
@JoinColumn(name = "user_id", nullable = false)
private User user;

@ManyToOne
@JoinColumn(name="vote_option_id",nullable = false)
private VoteOption voteOption;
}


1 change: 0 additions & 1 deletion src/main/java/store/itpick/backend/model/Vote.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Getter
public class Vote {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/store/itpick/backend/model/VoteOption.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import lombok.*;

import java.sql.Timestamp;
import java.util.List;

@Entity
@Table(name = "vote_option")
Expand Down Expand Up @@ -37,4 +38,7 @@ public class VoteOption {
@ManyToOne
@JoinColumn(name = "vote_id", nullable = false)
private Vote vote;

@OneToMany(mappedBy = "voteOption")
private List<UserVoteChoice> userVoteChoices;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package store.itpick.backend.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import store.itpick.backend.model.User;
import store.itpick.backend.model.UserVoteChoice;
import store.itpick.backend.model.Vote;

public interface UserVoteChoiceRepository extends JpaRepository<UserVoteChoice, Long> {
void deleteByVoteOption_VoteAndUser(Vote vote, User user);
}

Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package store.itpick.backend.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import store.itpick.backend.model.User;
import store.itpick.backend.model.Vote;
import store.itpick.backend.model.VoteOption;

public interface VoteOptionRepository extends JpaRepository<VoteOption,Long> {
public interface VoteOptionRepository extends JpaRepository<VoteOption, Long> {
}

Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@ public PostCommentHeartResponse creatCommentHeart(PostCommentHeartRequest postCo
.commentHeartId(deletedCommentHeartId)
.build();
} else {
// 존재하지 않으면 새로운 CommentHeart 생성 및 저장
CommentHeart commentHeart = CommentHeart.builder()
.user(userOptional.get())
.comment(commentOptional.get())
Expand Down
36 changes: 28 additions & 8 deletions src/main/java/store/itpick/backend/service/VoteService.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,31 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import store.itpick.backend.common.exception.UserException;
import store.itpick.backend.common.exception.VoteException;
import store.itpick.backend.dto.debate.VoteOptionRequest;
import store.itpick.backend.dto.vote.PostUserVoteChoiceRequest;
import store.itpick.backend.dto.vote.PostVoteRequest;
import store.itpick.backend.dto.vote.PostVoteResponse;
import store.itpick.backend.model.Debate;
import store.itpick.backend.model.Vote;
import store.itpick.backend.model.VoteOption;
import store.itpick.backend.repository.DebateRepository;
import store.itpick.backend.repository.VoteRepository;
import store.itpick.backend.repository.VoteOptionRepository;
import store.itpick.backend.model.*;
import store.itpick.backend.repository.*;

import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.List;


import static store.itpick.backend.common.response.status.BaseExceptionResponseStatus.INVALID_DEBATE_ID;
import static store.itpick.backend.common.response.status.BaseExceptionResponseStatus.*;

@Slf4j
@Service
@RequiredArgsConstructor
public class VoteService {

private final UserRepository userRepository;
private final VoteRepository voteRepository;
private final DebateRepository debateRepository;
private final VoteOptionRepository voteOptionRepository;
private final UserVoteChoiceRepository userVoteChoiceRepository;

@Transactional
public PostVoteResponse createVote(PostVoteRequest postVoteRequest, List<VoteOptionRequest> voteOptions) {
Expand Down Expand Up @@ -67,4 +66,25 @@ public void createVoteOptions(Vote vote, List<VoteOptionRequest> voteOptions) {
voteOptionRepository.save(voteOption);
}
}

@Transactional
public void createUserVoteChoice(PostUserVoteChoiceRequest postUserVoteChoiceRequest) {
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));

userVoteChoiceRepository.deleteByVoteOption_VoteAndUser(voteOption.getVote(), user);

UserVoteChoice userVoteChoice = UserVoteChoice.builder()
.user(user)
.voteOption(voteOption)
.status("active")
.createAt(Timestamp.valueOf(LocalDateTime.now()))
.updateAt(Timestamp.valueOf(LocalDateTime.now()))
.build();

userVoteChoiceRepository.save(userVoteChoice);
}
}

0 comments on commit 2bca6bb

Please sign in to comment.