src/main/java/com/forum/service/VoteService.java
package com.forum.service;
import com.forum.dto.VoteDto;
import com.forum.exceptions.PostNotFoundException;
import com.forum.exceptions.SpringForumException;
import com.forum.model.Post;
import com.forum.model.User;
import com.forum.model.Vote;
import com.forum.repository.PostRepository;
import com.forum.repository.VoteRepository;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Optional;
import static com.forum.model.VoteType.UPVOTE;
import static com.forum.model.VoteType.DOWNVOTE;
@Service
@AllArgsConstructor
public class VoteService {
private final VoteRepository voteRepository;
private final PostRepository postRepository;
private final AuthService authService;
public void vote(VoteDto voteDto) {
Post post = postRepository.findById(voteDto.getPostId()).orElseThrow(() -> new PostNotFoundException(voteDto.getPostId().toString()));
User currentUser = authService.getCurrentUser();
Optional<Vote> voteByPostAndUser = voteRepository.findTopByPostAndUserOrderByVoteIdDesc(post, currentUser);
if (voteByPostAndUser.isPresent() && voteByPostAndUser.get().getVoteType().equals(voteDto.getVoteType())) {
throw new SpringForumException("You have already " + voteDto.getVoteType() + "'d for this post");
}
if (UPVOTE.equals(voteDto.getVoteType())) {
post.setVoteCount(post.getVoteCount() + 1);
} else {
post.setVoteCount(post.getVoteCount() - 1);
}
voteRepository.save(mapToVote(voteDto, post));
postRepository.save(post);
}
private Vote mapToVote(VoteDto voteDto, Post post) {
return Vote.builder()
.voteType(voteDto.getVoteType())
.post(post)
.user(authService.getCurrentUser())
.build();
}
}