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;
|
2017-08-25 10:34:41 +07:00
|
|
|
import io.spring.application.data.ArticleFavoriteCount;
|
2017-08-15 09:47:18 +07:00
|
|
|
import io.spring.core.user.User;
|
2017-08-25 10:34:41 +07:00
|
|
|
import io.spring.infrastructure.mybatis.readservice.ArticleFavoritesReadService;
|
2017-08-18 16:08:27 +07:00
|
|
|
import io.spring.infrastructure.mybatis.readservice.ArticleReadService;
|
2017-08-21 16:25:00 +07:00
|
|
|
import io.spring.infrastructure.mybatis.readservice.UserRelationshipQueryService;
|
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;
|
2017-08-25 10:34:41 +07:00
|
|
|
private ArticleFavoritesReadService articleFavoritesReadService;
|
2017-08-15 09:47:18 +07:00
|
|
|
|
|
|
|
@Autowired
|
|
|
|
public ArticleQueryService(ArticleReadService articleReadService,
|
|
|
|
UserRelationshipQueryService userRelationshipQueryService,
|
2017-08-25 10:34:41 +07:00
|
|
|
ArticleFavoritesReadService articleFavoritesReadService) {
|
2017-08-15 09:47:18 +07:00
|
|
|
this.articleReadService = articleReadService;
|
|
|
|
this.userRelationshipQueryService = userRelationshipQueryService;
|
2017-08-25 10:34:41 +07:00
|
|
|
this.articleFavoritesReadService = articleFavoritesReadService;
|
2017-08-15 09:47:18 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
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) {
|
2017-08-25 10:34:41 +07:00
|
|
|
List<ArticleFavoriteCount> favoritesCounts = articleFavoritesReadService.articlesFavoriteCount(articles.stream().map(ArticleData::getId).collect(toList()));
|
2017-08-17 16:17:37 +07:00
|
|
|
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) {
|
2017-08-25 10:34:41 +07:00
|
|
|
Set<String> favoritedArticles = articleFavoritesReadService.userFavorites(articles.stream().map(articleData -> articleData.getId()).collect(toList()), currentUser);
|
2017-08-17 16:17:37 +07:00
|
|
|
|
|
|
|
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) {
|
2017-08-25 10:34:41 +07:00
|
|
|
articleData.setFavorited(articleFavoritesReadService.isUserFavorite(user.getId(), id));
|
|
|
|
articleData.setFavoritesCount(articleFavoritesReadService.articleFavoriteCount(id));
|
2017-08-15 10:21:55 +07:00
|
|
|
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
|
|
|
|