Skip to content

Commit

Permalink
Merge pull request #92 from ho0010/dev
Browse files Browse the repository at this point in the history
Feat: getDebate API
  • Loading branch information
ho0010 authored Aug 15, 2024
2 parents c0dc547 + 2202b93 commit 60d5cbc
Show file tree
Hide file tree
Showing 12 changed files with 196 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ public enum BaseExceptionResponseStatus implements ResponseStatus {
INVALID_COMMENT_HEART_VALUE(6004,HttpStatus.BAD_REQUEST.value(), "댓글 좋아요 생성 요청에서 잘못된 값이 존재합니다."),
COMMENT_NOT_FOUND(6005,HttpStatus.BAD_REQUEST.value(), "해당 댓글이 존재하지 않습니다."),
KEYWORD_NOT_FOUND(6006,HttpStatus.BAD_REQUEST.value(), "해당 키워드가 존재하지 않습니다."),
INVALID_GET_DEBATE_VALUE(6007,HttpStatus.BAD_REQUEST.value(), "토론 상세 정보 요청에서 잘못된 값이 존재합니다."),



/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,21 @@ public BaseResponse<Object> deleteUserVoteChoice(@Valid @RequestBody DeleteUserV
voteService.deleteUserVoteChoice(deleteUserVoteChoiceRequest);
return new BaseResponse<>(HttpStatus.OK);
}

@GetMapping("/details")
public BaseResponse<GetDebateResponse> getDebate(
@RequestParam Long debateId,
@RequestHeader("Authorization") String token,BindingResult bindingResult) {

String jwtToken = token.substring(7);


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

GetDebateResponse debateResponse = debateService.getDebate(debateId, jwtToken);

return new BaseResponse<>(debateResponse);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package store.itpick.backend.dto.debate;

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

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class GetDebateRequest {

@NotNull(message = "User ID는 필수입니다.")
private Long userId;

@NotNull(message = "Debate ID는 필수입니다.")
private Long debateId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package store.itpick.backend.dto.debate;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

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

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class GetDebateResponse {

private Long debateId;
private String title;
private String content;
private Long hits;
private boolean onTrend;
private String status;
private Timestamp createAt;
private Timestamp updateAt;
private String keyword;
private String userNickname;
private String userImgUrl;
private List<VoteOptionResponse> voteOptions;
private List<CommentResponse> comments;
private boolean userVoted;
private String userVoteOptionText;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class VoteOptionResponse {
private String optionText;
private String imgUrl;
private long voteCount;
}

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public static class CommentResponse {
private Long commentId;
private String commentText;
private String userNickname;
private String userImgUrl;
private Timestamp createAt;
private long commentHeartCount;
private boolean userHearted;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
@Builder
public class PostDebateRequest {

@NotNull(message = "user ID는 필수입니다.")
private Long userId;

@NotNull(message = "keyword ID는 필수입니다.")
private Long keywordId;

Expand Down
2 changes: 2 additions & 0 deletions src/main/java/store/itpick/backend/jwt/JwtProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -120,4 +120,6 @@ public Long getUserIdFromToken(String token){

return claims.get("userId", Long.class);
}


}
4 changes: 4 additions & 0 deletions src/main/java/store/itpick/backend/model/Debate.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,8 @@ public class Debate {
@ManyToOne
@JoinColumn(name = "keyword_id", nullable = false)
private Keyword keyword;

@ManyToOne
@JoinColumn(name = "user_id",nullable = false)
private User user;
}
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 @@ -66,4 +66,7 @@ public class User {

@OneToMany(mappedBy = "user")
private List<UserVoteChoice> userVoteChoices;

@OneToMany(mappedBy = "user")
private List<Debate> debates;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,5 @@
@Repository
public interface CommentHeartRepository extends JpaRepository<CommentHeart, Long> {
CommentHeart findByUserAndComment(User user, Comment comment);
boolean existsByCommentAndUser_userId(Comment comment, Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import store.itpick.backend.model.Comment;
import store.itpick.backend.model.Debate;

import java.util.List;

@Repository
public interface CommentRepository extends JpaRepository<Comment,Long> {
List<Comment> findByDebate(Debate debate);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
import store.itpick.backend.model.Vote;
import store.itpick.backend.model.VoteOption;

import java.util.List;

public interface VoteOptionRepository extends JpaRepository<VoteOption, Long> {
List<VoteOption> findByVote(Vote vote);
}

82 changes: 81 additions & 1 deletion src/main/java/store/itpick/backend/service/DebateService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import org.springframework.stereotype.Service;
import store.itpick.backend.common.exception.DebateException;
import store.itpick.backend.common.exception.AuthException;
import store.itpick.backend.common.exception.UserException;
import store.itpick.backend.common.exception.jwt.unauthorized.JwtInvalidTokenException;
import store.itpick.backend.common.exception.jwt.unauthorized.JwtUnauthorizedTokenException;
import store.itpick.backend.dto.debate.*;
import store.itpick.backend.dto.vote.PostVoteRequest;
import store.itpick.backend.jwt.JwtProvider;
Expand All @@ -29,15 +32,21 @@ public class DebateService {
private final CommentRepository commentRepository;
private final CommentHeartRepository commentHeartRepository;
private final UserRepository userRepository;
private final UserVoteChoiceRepository userVoteChoiceRepository;
private final VoteOptionRepository voteOptionRepository;
private final VoteService voteService;
private final JwtProvider jwtProvider;

@Transactional
public PostDebateResponse createDebate(PostDebateRequest postDebateRequest) {

User user = userRepository.findById(postDebateRequest.getUserId())
.orElseThrow(() -> new UserException(USER_NOT_FOUND));

Keyword keyword = keywordRepository.findById(postDebateRequest.getKeywordId())
.orElseThrow(() -> new DebateException(KEYWORD_NOT_FOUND));

Debate debate = Debate.builder().title(postDebateRequest.getTitle()).content(postDebateRequest.getContent()).hits(0L).onTrend(false).status("active").createAt(Timestamp.valueOf(LocalDateTime.now())).updateAt(Timestamp.valueOf(LocalDateTime.now())).keyword(keyword).build();
Debate debate = Debate.builder().title(postDebateRequest.getTitle()).content(postDebateRequest.getContent()).hits(0L).onTrend(false).status("active").createAt(Timestamp.valueOf(LocalDateTime.now())).updateAt(Timestamp.valueOf(LocalDateTime.now())).keyword(keyword).user(user).build();

debate = debateRepository.save(debate);

Expand Down Expand Up @@ -116,4 +125,75 @@ public PostCommentHeartResponse creatCommentHeart(PostCommentHeartRequest postCo
return new PostCommentHeartResponse(commentHeart.getCommentHeartId());
}
}

@Transactional
public GetDebateResponse getDebate(Long debateId, String token) {

if (jwtProvider.isExpiredToken(token)) {
throw new JwtUnauthorizedTokenException(INVALID_TOKEN);
}

Long userId = jwtProvider.getUserIdFromToken(token);

Debate debate = debateRepository.findById(debateId)
.orElseThrow(() -> new DebateException(DEBATE_NOT_FOUND));

User user = debate.getUser();

boolean userVoted = false;
String userVoteOptionText = null;

for (VoteOption voteOption : debate.getVote().getVoteOptions()) {
UserVoteChoice userVoteChoice = userVoteChoiceRepository.findByVoteOptionAndUser(voteOption, user);
if (userVoteChoice != null) {
userVoted = true;
userVoteOptionText = voteOption.getOptionText();
break;
}
}

List<GetDebateResponse.VoteOptionResponse> voteOptions = voteOptionRepository.findByVote(debate.getVote()).stream()
.map(option -> GetDebateResponse.VoteOptionResponse.builder()
.optionText(option.getOptionText())
.imgUrl(option.getImgUrl())
.voteCount(option.getUserVoteChoices().size())
.build())
.toList();

List<GetDebateResponse.CommentResponse> comments = commentRepository.findByDebate(debate).stream()
.map(comment -> {
boolean userHearted = commentHeartRepository.existsByCommentAndUser_userId(comment, userId);

return GetDebateResponse.CommentResponse.builder()
.commentId(comment.getCommentId())
.commentText(comment.getComment())
.userNickname(comment.getUser().getNickname())
.userImgUrl(comment.getUser().getImageUrl())
.createAt(comment.getCreateAt())
.commentHeartCount(comment.getCommentHearts().size())
.userHearted(userHearted)
.build();
})
.toList();


return GetDebateResponse.builder()
.debateId(debate.getDebateId())
.title(debate.getTitle())
.content(debate.getContent())
.hits(debate.getHits())
.onTrend(debate.isOnTrend())
.status(debate.getStatus())
.createAt(debate.getCreateAt())
.updateAt(debate.getUpdateAt())
.keyword(debate.getKeyword().getKeyword())
.userNickname(debate.getUser().getNickname())
.userImgUrl(debate.getUser().getImageUrl())
.voteOptions(voteOptions)
.comments(comments)
.userVoted(userVoted)
.userVoteOptionText(userVoteOptionText)
.build();
}

}

0 comments on commit 60d5cbc

Please sign in to comment.