mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-02-20 22:11:01 +08:00
refactor poll and lottery forms, add poll notifications
This commit is contained in:
@@ -44,7 +44,7 @@ public class PostController {
|
||||
req.getType(), req.getPrizeDescription(), req.getPrizeIcon(),
|
||||
req.getPrizeCount(), req.getPointCost(),
|
||||
req.getStartTime(), req.getEndTime(),
|
||||
req.getQuestion(), req.getOptions());
|
||||
req.getOptions());
|
||||
draftService.deleteDraft(auth.getName());
|
||||
PostDetailDto dto = postMapper.toDetailDto(post, auth.getName());
|
||||
dto.setReward(levelService.awardForPost(auth.getName()));
|
||||
|
||||
@@ -8,7 +8,6 @@ import java.util.Map;
|
||||
|
||||
@Data
|
||||
public class PollDto {
|
||||
private String question;
|
||||
private List<String> options;
|
||||
private Map<Integer, Integer> votes;
|
||||
private LocalDateTime endTime;
|
||||
|
||||
@@ -27,7 +27,6 @@ public class PostRequest {
|
||||
private LocalDateTime startTime;
|
||||
private LocalDateTime endTime;
|
||||
// fields for poll posts
|
||||
private String question;
|
||||
private List<String> options;
|
||||
}
|
||||
|
||||
|
||||
@@ -103,7 +103,6 @@ public class PostMapper {
|
||||
|
||||
if (post instanceof PollPost pp) {
|
||||
PollDto p = new PollDto();
|
||||
p.setQuestion(pp.getQuestion());
|
||||
p.setOptions(pp.getOptions());
|
||||
p.setVotes(pp.getVotes());
|
||||
p.setEndTime(pp.getEndTime());
|
||||
|
||||
@@ -40,6 +40,12 @@ public enum NotificationType {
|
||||
LOTTERY_WIN,
|
||||
/** Your lottery post was drawn */
|
||||
LOTTERY_DRAW,
|
||||
/** Someone participated in your poll */
|
||||
POLL_VOTE,
|
||||
/** Your poll post has concluded */
|
||||
POLL_RESULT_OWNER,
|
||||
/** A poll you participated in has concluded */
|
||||
POLL_RESULT_PARTICIPANT,
|
||||
/** Your post was featured */
|
||||
POST_FEATURED,
|
||||
/** You were mentioned in a post or comment */
|
||||
|
||||
@@ -15,10 +15,6 @@ import java.util.*;
|
||||
@NoArgsConstructor
|
||||
@PrimaryKeyJoinColumn(name = "post_id")
|
||||
public class PollPost extends Post {
|
||||
|
||||
@Column(nullable = false)
|
||||
private String question;
|
||||
|
||||
@ElementCollection
|
||||
@CollectionTable(name = "poll_post_options", joinColumns = @JoinColumn(name = "post_id"))
|
||||
@Column(name = "option_text")
|
||||
@@ -38,4 +34,7 @@ public class PollPost extends Post {
|
||||
|
||||
@Column
|
||||
private LocalDateTime endTime;
|
||||
|
||||
@Column
|
||||
private boolean resultAnnounced = false;
|
||||
}
|
||||
|
||||
@@ -3,5 +3,11 @@ package com.openisle.repository;
|
||||
import com.openisle.model.PollPost;
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
public interface PollPostRepository extends JpaRepository<PollPost, Long> {
|
||||
List<PollPost> findByEndTimeAfterAndResultAnnouncedFalse(LocalDateTime now);
|
||||
|
||||
List<PollPost> findByEndTimeBeforeAndResultAnnouncedFalse(LocalDateTime now);
|
||||
}
|
||||
|
||||
@@ -135,6 +135,15 @@ public class PostService {
|
||||
for (LotteryPost lp : lotteryPostRepository.findByEndTimeBeforeAndWinnersIsEmpty(now)) {
|
||||
applicationContext.getBean(PostService.class).finalizeLottery(lp.getId());
|
||||
}
|
||||
for (PollPost pp : pollPostRepository.findByEndTimeAfterAndResultAnnouncedFalse(now)) {
|
||||
ScheduledFuture<?> future = taskScheduler.schedule(
|
||||
() -> applicationContext.getBean(PostService.class).finalizePoll(pp.getId()),
|
||||
java.util.Date.from(pp.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
|
||||
scheduledFinalizations.put(pp.getId(), future);
|
||||
}
|
||||
for (PollPost pp : pollPostRepository.findByEndTimeBeforeAndResultAnnouncedFalse(now)) {
|
||||
applicationContext.getBean(PostService.class).finalizePoll(pp.getId());
|
||||
}
|
||||
}
|
||||
|
||||
public PublishMode getPublishMode() {
|
||||
@@ -177,7 +186,6 @@ public class PostService {
|
||||
Integer pointCost,
|
||||
LocalDateTime startTime,
|
||||
LocalDateTime endTime,
|
||||
String question,
|
||||
java.util.List<String> options) {
|
||||
long recent = postRepository.countByAuthorAfter(username,
|
||||
java.time.LocalDateTime.now().minusMinutes(5));
|
||||
@@ -217,7 +225,6 @@ public class PostService {
|
||||
throw new IllegalArgumentException("At least two options required");
|
||||
}
|
||||
PollPost pp = new PollPost();
|
||||
pp.setQuestion(question);
|
||||
pp.setOptions(options);
|
||||
pp.setEndTime(endTime);
|
||||
post = pp;
|
||||
@@ -269,6 +276,11 @@ public class PostService {
|
||||
() -> applicationContext.getBean(PostService.class).finalizeLottery(lp.getId()),
|
||||
java.util.Date.from(lp.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
|
||||
scheduledFinalizations.put(lp.getId(), future);
|
||||
} else if (post instanceof PollPost pp && pp.getEndTime() != null) {
|
||||
ScheduledFuture<?> future = taskScheduler.schedule(
|
||||
() -> applicationContext.getBean(PostService.class).finalizePoll(pp.getId()),
|
||||
java.util.Date.from(pp.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
|
||||
scheduledFinalizations.put(pp.getId(), future);
|
||||
}
|
||||
return post;
|
||||
}
|
||||
@@ -311,7 +323,29 @@ public class PostService {
|
||||
vote.setUser(user);
|
||||
vote.setOptionIndex(optionIndex);
|
||||
pollVoteRepository.save(vote);
|
||||
return pollPostRepository.save(post);
|
||||
PollPost saved = pollPostRepository.save(post);
|
||||
if (post.getAuthor() != null && !post.getAuthor().getId().equals(user.getId())) {
|
||||
notificationService.createNotification(post.getAuthor(), NotificationType.POLL_VOTE, post, null, null, user, null, null);
|
||||
}
|
||||
return saved;
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public void finalizePoll(Long postId) {
|
||||
scheduledFinalizations.remove(postId);
|
||||
pollPostRepository.findById(postId).ifPresent(pp -> {
|
||||
if (pp.isResultAnnounced()) {
|
||||
return;
|
||||
}
|
||||
pp.setResultAnnounced(true);
|
||||
pollPostRepository.save(pp);
|
||||
if (pp.getAuthor() != null) {
|
||||
notificationService.createNotification(pp.getAuthor(), NotificationType.POLL_RESULT_OWNER, pp, null, null, null, null, null);
|
||||
}
|
||||
for (User participant : pp.getParticipants()) {
|
||||
notificationService.createNotification(participant, NotificationType.POLL_RESULT_PARTICIPANT, pp, null, null, null, null, null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Transactional
|
||||
|
||||
Reference in New Issue
Block a user