mirror of
https://github.com/nagisa77/OpenIsle.git
synced 2026-02-24 07:00:49 +08:00
feat: support featured medals
This commit is contained in:
@@ -6,6 +6,7 @@ import com.openisle.dto.MedalDto;
|
||||
import com.openisle.dto.PostMedalDto;
|
||||
import com.openisle.dto.SeedUserMedalDto;
|
||||
import com.openisle.dto.PioneerMedalDto;
|
||||
import com.openisle.dto.FeaturedMedalDto;
|
||||
import com.openisle.model.MedalType;
|
||||
import com.openisle.model.User;
|
||||
import com.openisle.repository.CommentRepository;
|
||||
@@ -74,6 +75,23 @@ public class MedalService {
|
||||
postMedal.setSelected(selected == MedalType.POST);
|
||||
medals.add(postMedal);
|
||||
|
||||
FeaturedMedalDto featuredMedal = new FeaturedMedalDto();
|
||||
featuredMedal.setIcon("https://openisle-1307107697.cos.ap-guangzhou.myqcloud.com/assert/icons/achi_rss.png");
|
||||
featuredMedal.setTitle("精选作者");
|
||||
featuredMedal.setDescription("至少有1篇文章被收录为精选");
|
||||
featuredMedal.setType(MedalType.FEATURED);
|
||||
featuredMedal.setTargetFeaturedCount(1);
|
||||
if (user != null) {
|
||||
long count = postRepository.countByAuthor_IdAndRssExcludedFalse(user.getId());
|
||||
featuredMedal.setCurrentFeaturedCount(count);
|
||||
featuredMedal.setCompleted(count >= 1);
|
||||
} else {
|
||||
featuredMedal.setCurrentFeaturedCount(0);
|
||||
featuredMedal.setCompleted(false);
|
||||
}
|
||||
featuredMedal.setSelected(selected == MedalType.FEATURED);
|
||||
medals.add(featuredMedal);
|
||||
|
||||
ContributorMedalDto contributorMedal = new ContributorMedalDto();
|
||||
contributorMedal.setIcon("https://openisle-1307107697.cos.ap-guangzhou.myqcloud.com/assert/icons/achi_coder.png");
|
||||
contributorMedal.setTitle("贡献者");
|
||||
@@ -141,6 +159,8 @@ public class MedalService {
|
||||
user.setDisplayMedal(MedalType.COMMENT);
|
||||
} else if (postRepository.countByAuthor_Id(user.getId()) >= POST_TARGET) {
|
||||
user.setDisplayMedal(MedalType.POST);
|
||||
} else if (postRepository.countByAuthor_IdAndRssExcludedFalse(user.getId()) >= 1) {
|
||||
user.setDisplayMedal(MedalType.FEATURED);
|
||||
} else if (contributorService.getContributionLines(user.getUsername()) >= CONTRIBUTION_TARGET) {
|
||||
user.setDisplayMedal(MedalType.CONTRIBUTOR);
|
||||
} else if (userRepository.countByCreatedAtBefore(user.getCreatedAt()) < PIONEER_LIMIT) {
|
||||
|
||||
@@ -33,6 +33,12 @@ public class PointService {
|
||||
return addPoint(user, 500, PointHistoryType.INVITE, null, null, invitee);
|
||||
}
|
||||
|
||||
public int awardForFeatured(String userName, Long postId) {
|
||||
User user = userRepository.findByUsername(userName).orElseThrow();
|
||||
Post post = postRepository.findById(postId).orElseThrow();
|
||||
return addPoint(user, 500, PointHistoryType.FEATURE, post, null, null);
|
||||
}
|
||||
|
||||
private PointLog getTodayLog(User user) {
|
||||
LocalDate today = LocalDate.now();
|
||||
return pointLogRepository.findByUserAndLogDate(user, today)
|
||||
|
||||
@@ -67,6 +67,7 @@ public class PostService {
|
||||
private final TaskScheduler taskScheduler;
|
||||
private final EmailSender emailSender;
|
||||
private final ApplicationContext applicationContext;
|
||||
private final PointService pointService;
|
||||
private final ConcurrentMap<Long, ScheduledFuture<?>> scheduledFinalizations = new ConcurrentHashMap<>();
|
||||
@Value("${app.website-url:https://www.open-isle.com}")
|
||||
private String websiteUrl;
|
||||
@@ -89,6 +90,7 @@ public class PostService {
|
||||
TaskScheduler taskScheduler,
|
||||
EmailSender emailSender,
|
||||
ApplicationContext applicationContext,
|
||||
PointService pointService,
|
||||
@Value("${app.post.publish-mode:DIRECT}") PublishMode publishMode) {
|
||||
this.postRepository = postRepository;
|
||||
this.userRepository = userRepository;
|
||||
@@ -107,6 +109,7 @@ public class PostService {
|
||||
this.taskScheduler = taskScheduler;
|
||||
this.emailSender = emailSender;
|
||||
this.applicationContext = applicationContext;
|
||||
this.pointService = pointService;
|
||||
this.publishMode = publishMode;
|
||||
}
|
||||
|
||||
@@ -146,7 +149,10 @@ public class PostService {
|
||||
public Post includeInRss(Long id) {
|
||||
Post post = postRepository.findById(id).orElseThrow(() -> new com.openisle.exception.NotFoundException("Post not found"));
|
||||
post.setRssExcluded(false);
|
||||
return postRepository.save(post);
|
||||
post = postRepository.save(post);
|
||||
notificationService.createNotification(post.getAuthor(), NotificationType.POST_FEATURED, post, null, null, null, null, null);
|
||||
pointService.awardForFeatured(post.getAuthor().getUsername(), post.getId());
|
||||
return post;
|
||||
}
|
||||
|
||||
public Post createPost(String username,
|
||||
@@ -458,6 +464,26 @@ public class PostService {
|
||||
return paginate(sortByPinnedAndCreated(posts), page, pageSize);
|
||||
}
|
||||
|
||||
public List<Post> listFeaturedPosts(java.util.List<Long> categoryIds,
|
||||
java.util.List<Long> tagIds,
|
||||
Integer page,
|
||||
Integer pageSize) {
|
||||
List<Post> posts;
|
||||
boolean hasCategories = categoryIds != null && !categoryIds.isEmpty();
|
||||
boolean hasTags = tagIds != null && !tagIds.isEmpty();
|
||||
if (hasCategories && hasTags) {
|
||||
posts = listPostsByCategoriesAndTags(categoryIds, tagIds, null, null);
|
||||
} else if (hasCategories) {
|
||||
posts = listPostsByCategories(categoryIds, null, null);
|
||||
} else if (hasTags) {
|
||||
posts = listPostsByTags(tagIds, null, null);
|
||||
} else {
|
||||
posts = listPosts();
|
||||
}
|
||||
posts = posts.stream().filter(p -> !Boolean.TRUE.equals(p.getRssExcluded())).toList();
|
||||
return paginate(sortByPinnedAndCreated(posts), page, pageSize);
|
||||
}
|
||||
|
||||
public List<Post> listPendingPosts() {
|
||||
return postRepository.findByStatus(PostStatus.PENDING);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user