Skip to content

Commit

Permalink
Feat: getDebate API
Browse files Browse the repository at this point in the history
  • Loading branch information
ho0010 committed Aug 15, 2024
1 parent a4d9934 commit fd517a8
Show file tree
Hide file tree
Showing 8 changed files with 173 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,15 @@ 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) {

String jwtToken = token.substring(7);

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;
}
}
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);
}


}
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);
}

76 changes: 76 additions & 0 deletions src/main/java/store/itpick/backend/service/DebateService.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
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 @@ -30,7 +32,10 @@ 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) {
Expand Down Expand Up @@ -120,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 fd517a8

Please sign in to comment.