spring-boot-realworld-examp.../src/main/java/io/spring/application/ArticleQueryService.java

138 lines
5.6 KiB
Java
Raw Normal View History

2017-08-18 16:08:27 +07:00
package io.spring.application;
2017-08-15 09:47:18 +07:00
2017-08-18 16:08:27 +07:00
import io.spring.application.data.ArticleData;
import io.spring.application.data.ArticleDataList;
import io.spring.infrastructure.mybatis.readservice.UserRelationshipQueryService;
2017-08-15 09:47:18 +07:00
import io.spring.core.user.User;
2017-08-18 16:08:27 +07:00
import io.spring.infrastructure.mybatis.readservice.ArticleReadService;
2017-08-17 16:17:37 +07:00
import lombok.Data;
import lombok.NoArgsConstructor;
2017-08-15 09:47:18 +07:00
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
2017-08-17 13:27:29 +07:00
import java.util.ArrayList;
2017-08-17 16:17:37 +07:00
import java.util.HashMap;
2017-08-17 13:27:29 +07:00
import java.util.List;
2017-08-17 16:17:37 +07:00
import java.util.Map;
2017-08-15 09:47:18 +07:00
import java.util.Optional;
2017-08-17 16:17:37 +07:00
import java.util.Set;
import static java.util.stream.Collectors.toList;
2017-08-15 09:47:18 +07:00
@Service
public class ArticleQueryService {
private ArticleReadService articleReadService;
private UserRelationshipQueryService userRelationshipQueryService;
private ArticleFavoritesQueryService articleFavoritesQueryService;
@Autowired
public ArticleQueryService(ArticleReadService articleReadService,
UserRelationshipQueryService userRelationshipQueryService,
ArticleFavoritesQueryService articleFavoritesQueryService) {
this.articleReadService = articleReadService;
this.userRelationshipQueryService = userRelationshipQueryService;
this.articleFavoritesQueryService = articleFavoritesQueryService;
}
public Optional<ArticleData> findById(String id, User user) {
2017-08-15 10:21:55 +07:00
ArticleData articleData = articleReadService.findById(id);
2017-08-15 09:47:18 +07:00
if (articleData == null) {
return Optional.empty();
} else {
2017-08-15 10:21:55 +07:00
if (user != null) {
fillExtraInfo(id, user, articleData);
}
2017-08-15 09:47:18 +07:00
return Optional.of(articleData);
}
}
2017-08-15 10:21:55 +07:00
public Optional<ArticleData> findBySlug(String slug, User user) {
ArticleData articleData = articleReadService.findBySlug(slug);
if (articleData == null) {
return Optional.empty();
} else {
if (user != null) {
fillExtraInfo(articleData.getId(), user, articleData);
}
return Optional.of(articleData);
}
}
2017-08-17 16:17:37 +07:00
public ArticleDataList findRecentArticles(String tag, String author, String favoritedBy, Page page, User currentUser) {
List<String> articleIds = articleReadService.queryArticles(tag, author, favoritedBy, page);
int articleCount = articleReadService.countArticle(tag, author, favoritedBy);
if (articleIds.size() == 0) {
return new ArticleDataList(new ArrayList<>(), articleCount);
} else {
List<ArticleData> articles = articleReadService.findArticles(articleIds);
fillExtraInfo(articles, currentUser);
return new ArticleDataList(articles, articleCount);
}
}
private void fillExtraInfo(List<ArticleData> articles, User currentUser) {
setFavoriteCount(articles);
if (currentUser != null) {
setIsFavorite(articles, currentUser);
setIsFollowingAuthor(articles, currentUser);
}
}
private void setIsFollowingAuthor(List<ArticleData> articles, User currentUser) {
Set<String> followingAuthors = userRelationshipQueryService.followingAuthors(
currentUser.getId(),
articles.stream().map(articleData1 -> articleData1.getProfileData().getId()).collect(toList()));
articles.forEach(articleData -> {
if (followingAuthors.contains(articleData.getProfileData().getId())) {
articleData.getProfileData().setFollowing(true);
}
});
}
private void setFavoriteCount(List<ArticleData> articles) {
List<ArticleFavoriteCount> favoritesCounts = articleFavoritesQueryService.articlesFavoriteCount(articles.stream().map(ArticleData::getId).collect(toList()));
Map<String, Integer> countMap = new HashMap<>();
favoritesCounts.forEach(item -> {
countMap.put(item.getId(), item.getCount());
});
articles.forEach(articleData -> articleData.setFavoritesCount(countMap.get(articleData.getId())));
}
private void setIsFavorite(List<ArticleData> articles, User currentUser) {
Set<String> favoritedArticles = articleFavoritesQueryService.userFavorites(articles.stream().map(articleData -> articleData.getId()).collect(toList()), currentUser);
articles.forEach(articleData -> {
if (favoritedArticles.contains(articleData.getId())) {
articleData.setFavorited(true);
}
});
}
2017-08-15 10:21:55 +07:00
private void fillExtraInfo(String id, User user, ArticleData articleData) {
articleData.setFavorited(articleFavoritesQueryService.isUserFavorite(user.getId(), id));
articleData.setFavoritesCount(articleFavoritesQueryService.articleFavoriteCount(id));
articleData.getProfileData().setFollowing(
userRelationshipQueryService.isUserFollowing(
user.getId(),
articleData.getProfileData().getId()));
}
2017-08-17 13:27:29 +07:00
2017-08-17 16:17:37 +07:00
public ArticleDataList findUserFeed(User user, Page page) {
List<String> followdUsers = userRelationshipQueryService.followedUsers(user.getId());
if (followdUsers.size() == 0) {
return new ArticleDataList(new ArrayList<>(), 0);
} else {
List<ArticleData> articles = articleReadService.findArticlesOfAuthors(followdUsers, page);
fillExtraInfo(articles, user);
int count = articleReadService.countFeedSize(followdUsers);
return new ArticleDataList(articles, count);
}
2017-08-17 13:27:29 +07:00
}
2017-08-15 09:47:18 +07:00
}
2017-08-17 16:17:37 +07:00
@Data
@NoArgsConstructor
class ArticleFavoriteCount {
private String id;
private int count;
}