mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-03-08 04:50:45 +08:00
feat: add poll vote repository
This commit is contained in:
@@ -13,4 +13,5 @@ public class PollDto {
|
|||||||
private Map<Integer, Integer> votes;
|
private Map<Integer, Integer> votes;
|
||||||
private LocalDateTime endTime;
|
private LocalDateTime endTime;
|
||||||
private List<AuthorDto> participants;
|
private List<AuthorDto> participants;
|
||||||
|
private Map<Integer, List<AuthorDto>> optionParticipants;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,19 +6,23 @@ import com.openisle.dto.PostSummaryDto;
|
|||||||
import com.openisle.dto.ReactionDto;
|
import com.openisle.dto.ReactionDto;
|
||||||
import com.openisle.dto.LotteryDto;
|
import com.openisle.dto.LotteryDto;
|
||||||
import com.openisle.dto.PollDto;
|
import com.openisle.dto.PollDto;
|
||||||
|
import com.openisle.dto.AuthorDto;
|
||||||
import com.openisle.model.CommentSort;
|
import com.openisle.model.CommentSort;
|
||||||
import com.openisle.model.Post;
|
import com.openisle.model.Post;
|
||||||
import com.openisle.model.LotteryPost;
|
import com.openisle.model.LotteryPost;
|
||||||
import com.openisle.model.PollPost;
|
import com.openisle.model.PollPost;
|
||||||
import com.openisle.model.User;
|
import com.openisle.model.User;
|
||||||
|
import com.openisle.model.PollVote;
|
||||||
import com.openisle.service.CommentService;
|
import com.openisle.service.CommentService;
|
||||||
import com.openisle.service.ReactionService;
|
import com.openisle.service.ReactionService;
|
||||||
import com.openisle.service.SubscriptionService;
|
import com.openisle.service.SubscriptionService;
|
||||||
|
import com.openisle.repository.PollVoteRepository;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/** Mapper responsible for converting posts into DTOs. */
|
/** Mapper responsible for converting posts into DTOs. */
|
||||||
@@ -34,6 +38,7 @@ public class PostMapper {
|
|||||||
private final UserMapper userMapper;
|
private final UserMapper userMapper;
|
||||||
private final TagMapper tagMapper;
|
private final TagMapper tagMapper;
|
||||||
private final CategoryMapper categoryMapper;
|
private final CategoryMapper categoryMapper;
|
||||||
|
private final PollVoteRepository pollVoteRepository;
|
||||||
|
|
||||||
public PostSummaryDto toSummaryDto(Post post) {
|
public PostSummaryDto toSummaryDto(Post post) {
|
||||||
PostSummaryDto dto = new PostSummaryDto();
|
PostSummaryDto dto = new PostSummaryDto();
|
||||||
@@ -103,6 +108,10 @@ public class PostMapper {
|
|||||||
p.setVotes(pp.getVotes());
|
p.setVotes(pp.getVotes());
|
||||||
p.setEndTime(pp.getEndTime());
|
p.setEndTime(pp.getEndTime());
|
||||||
p.setParticipants(pp.getParticipants().stream().map(userMapper::toAuthorDto).collect(Collectors.toList()));
|
p.setParticipants(pp.getParticipants().stream().map(userMapper::toAuthorDto).collect(Collectors.toList()));
|
||||||
|
Map<Integer, List<AuthorDto>> optionParticipants = pollVoteRepository.findByPostId(pp.getId()).stream()
|
||||||
|
.collect(Collectors.groupingBy(PollVote::getOptionIndex,
|
||||||
|
Collectors.mapping(v -> userMapper.toAuthorDto(v.getUser()), Collectors.toList())));
|
||||||
|
p.setOptionParticipants(optionParticipants);
|
||||||
dto.setPoll(p);
|
dto.setPoll(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
28
backend/src/main/java/com/openisle/model/PollVote.java
Normal file
28
backend/src/main/java/com/openisle/model/PollVote.java
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
package com.openisle.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "poll_votes", uniqueConstraints = @UniqueConstraint(columnNames = {"post_id", "user_id"}))
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class PollVote {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY, optional = false)
|
||||||
|
@JoinColumn(name = "post_id")
|
||||||
|
private PollPost post;
|
||||||
|
|
||||||
|
@ManyToOne(fetch = FetchType.LAZY, optional = false)
|
||||||
|
@JoinColumn(name = "user_id")
|
||||||
|
private User user;
|
||||||
|
|
||||||
|
@Column(name = "option_index", nullable = false)
|
||||||
|
private int optionIndex;
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package com.openisle.repository;
|
||||||
|
|
||||||
|
import com.openisle.model.PollVote;
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public interface PollVoteRepository extends JpaRepository<PollVote, Long> {
|
||||||
|
List<PollVote> findByPostId(Long postId);
|
||||||
|
}
|
||||||
@@ -10,6 +10,7 @@ import com.openisle.model.Comment;
|
|||||||
import com.openisle.model.NotificationType;
|
import com.openisle.model.NotificationType;
|
||||||
import com.openisle.model.LotteryPost;
|
import com.openisle.model.LotteryPost;
|
||||||
import com.openisle.model.PollPost;
|
import com.openisle.model.PollPost;
|
||||||
|
import com.openisle.model.PollVote;
|
||||||
import com.openisle.repository.PostRepository;
|
import com.openisle.repository.PostRepository;
|
||||||
import com.openisle.repository.LotteryPostRepository;
|
import com.openisle.repository.LotteryPostRepository;
|
||||||
import com.openisle.repository.PollPostRepository;
|
import com.openisle.repository.PollPostRepository;
|
||||||
@@ -22,6 +23,7 @@ import com.openisle.repository.CommentRepository;
|
|||||||
import com.openisle.repository.ReactionRepository;
|
import com.openisle.repository.ReactionRepository;
|
||||||
import com.openisle.repository.PostSubscriptionRepository;
|
import com.openisle.repository.PostSubscriptionRepository;
|
||||||
import com.openisle.repository.NotificationRepository;
|
import com.openisle.repository.NotificationRepository;
|
||||||
|
import com.openisle.repository.PollVoteRepository;
|
||||||
import com.openisle.model.Role;
|
import com.openisle.model.Role;
|
||||||
import com.openisle.exception.RateLimitException;
|
import com.openisle.exception.RateLimitException;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -57,6 +59,7 @@ public class PostService {
|
|||||||
private final TagRepository tagRepository;
|
private final TagRepository tagRepository;
|
||||||
private final LotteryPostRepository lotteryPostRepository;
|
private final LotteryPostRepository lotteryPostRepository;
|
||||||
private final PollPostRepository pollPostRepository;
|
private final PollPostRepository pollPostRepository;
|
||||||
|
private final PollVoteRepository pollVoteRepository;
|
||||||
private PublishMode publishMode;
|
private PublishMode publishMode;
|
||||||
private final NotificationService notificationService;
|
private final NotificationService notificationService;
|
||||||
private final SubscriptionService subscriptionService;
|
private final SubscriptionService subscriptionService;
|
||||||
@@ -82,6 +85,7 @@ public class PostService {
|
|||||||
TagRepository tagRepository,
|
TagRepository tagRepository,
|
||||||
LotteryPostRepository lotteryPostRepository,
|
LotteryPostRepository lotteryPostRepository,
|
||||||
PollPostRepository pollPostRepository,
|
PollPostRepository pollPostRepository,
|
||||||
|
PollVoteRepository pollVoteRepository,
|
||||||
NotificationService notificationService,
|
NotificationService notificationService,
|
||||||
SubscriptionService subscriptionService,
|
SubscriptionService subscriptionService,
|
||||||
CommentService commentService,
|
CommentService commentService,
|
||||||
@@ -102,6 +106,7 @@ public class PostService {
|
|||||||
this.tagRepository = tagRepository;
|
this.tagRepository = tagRepository;
|
||||||
this.lotteryPostRepository = lotteryPostRepository;
|
this.lotteryPostRepository = lotteryPostRepository;
|
||||||
this.pollPostRepository = pollPostRepository;
|
this.pollPostRepository = pollPostRepository;
|
||||||
|
this.pollVoteRepository = pollVoteRepository;
|
||||||
this.notificationService = notificationService;
|
this.notificationService = notificationService;
|
||||||
this.subscriptionService = subscriptionService;
|
this.subscriptionService = subscriptionService;
|
||||||
this.commentService = commentService;
|
this.commentService = commentService;
|
||||||
@@ -301,6 +306,11 @@ public class PostService {
|
|||||||
}
|
}
|
||||||
post.getParticipants().add(user);
|
post.getParticipants().add(user);
|
||||||
post.getVotes().merge(optionIndex, 1, Integer::sum);
|
post.getVotes().merge(optionIndex, 1, Integer::sum);
|
||||||
|
PollVote vote = new PollVote();
|
||||||
|
vote.setPost(post);
|
||||||
|
vote.setUser(user);
|
||||||
|
vote.setOptionIndex(optionIndex);
|
||||||
|
pollVoteRepository.save(vote);
|
||||||
return pollPostRepository.save(post);
|
return pollPostRepository.save(post);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user