2017-08-18 16:08:27 +07:00
|
|
|
package io.spring.application;
|
2017-08-15 09:47:18 +07:00
|
|
|
|
2021-03-19 14:23:37 +07:00
|
|
|
import static java.util.stream.Collectors.toList;
|
|
|
|
|
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-17 13:27:29 +07:00
|
|
|
import java.util.ArrayList;
|
2021-03-19 14:23:37 +07:00
|
|
|
import java.util.Collections;
|
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;
|
2021-03-19 14:23:37 +07:00
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.stereotype.Service;
|
2017-08-15 09:47:18 +07:00
|
|
|
|
|
|
|
@Service
|
|
|
|
public class ArticleQueryService {
|
2021-03-19 14:23:37 +07:00
|
|
|
private ArticleReadService articleReadService;
|
|
|
|
private UserRelationshipQueryService userRelationshipQueryService;
|
|
|
|
private ArticleFavoritesReadService articleFavoritesReadService;
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
public ArticleQueryService(
|
|
|
|
ArticleReadService articleReadService,
|
|
|
|
UserRelationshipQueryService userRelationshipQueryService,
|
|
|
|
ArticleFavoritesReadService articleFavoritesReadService) {
|
|
|
|
this.articleReadService = articleReadService;
|
|
|
|
this.userRelationshipQueryService = userRelationshipQueryService;
|
|
|
|
this.articleFavoritesReadService = articleFavoritesReadService;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Optional<ArticleData> findById(String id, User user) {
|
|
|
|
ArticleData articleData = articleReadService.findById(id);
|
|
|
|
if (articleData == null) {
|
|
|
|
return Optional.empty();
|
|
|
|
} else {
|
|
|
|
if (user != null) {
|
|
|
|
fillExtraInfo(id, user, articleData);
|
|
|
|
}
|
|
|
|
return Optional.of(articleData);
|
2017-08-15 09:47:18 +07:00
|
|
|
}
|
2021-03-19 14:23:37 +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-15 09:47:18 +07:00
|
|
|
}
|
2021-03-19 14:23:37 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
public CursorPager<ArticleData> findRecentArticlesWithCursor(
|
|
|
|
String tag, String author, String favoritedBy, CursorPageParameter page, User currentUser) {
|
|
|
|
List<String> articleIds =
|
|
|
|
articleReadService.findArticlesWithCursor(tag, author, favoritedBy, page);
|
|
|
|
if (articleIds.size() == 0) {
|
|
|
|
return new CursorPager<>(new ArrayList<>(), page.getDirection(), false);
|
|
|
|
} else {
|
|
|
|
boolean hasExtra = articleIds.size() > page.getLimit();
|
|
|
|
if (hasExtra) {
|
|
|
|
articleIds.remove(page.getLimit());
|
|
|
|
}
|
|
|
|
if (!page.isNext()) {
|
|
|
|
Collections.reverse(articleIds);
|
|
|
|
}
|
|
|
|
|
|
|
|
List<ArticleData> articles = articleReadService.findArticles(articleIds);
|
|
|
|
fillExtraInfo(articles, currentUser);
|
|
|
|
|
|
|
|
return new CursorPager<>(articles, page.getDirection(), hasExtra);
|
2017-08-15 10:21:55 +07:00
|
|
|
}
|
2021-03-19 14:23:37 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
public CursorPager<ArticleData> findUserFeedWithCursor(User user, CursorPageParameter page) {
|
|
|
|
List<String> followdUsers = userRelationshipQueryService.followedUsers(user.getId());
|
|
|
|
if (followdUsers.size() == 0) {
|
|
|
|
return new CursorPager<>(new ArrayList<>(), page.getDirection(), false);
|
|
|
|
} else {
|
|
|
|
List<ArticleData> articles =
|
|
|
|
articleReadService.findArticlesOfAuthorsWithCursor(followdUsers, page);
|
|
|
|
boolean hasExtra = articles.size() > page.getLimit();
|
|
|
|
if (hasExtra) {
|
|
|
|
articles.remove(page.getLimit());
|
|
|
|
}
|
|
|
|
if (!page.isNext()) {
|
|
|
|
Collections.reverse(articles);
|
|
|
|
}
|
|
|
|
fillExtraInfo(articles, user);
|
|
|
|
return new CursorPager<>(articles, page.getDirection(), hasExtra);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
2017-08-17 16:17:37 +07:00
|
|
|
}
|
2021-03-19 14:23: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 16:17:37 +07:00
|
|
|
|
2021-03-19 14:23:37 +07:00
|
|
|
private void fillExtraInfo(List<ArticleData> articles, User currentUser) {
|
|
|
|
setFavoriteCount(articles);
|
|
|
|
if (currentUser != null) {
|
|
|
|
setIsFavorite(articles, currentUser);
|
|
|
|
setIsFollowingAuthor(articles, currentUser);
|
2017-08-17 16:17:37 +07:00
|
|
|
}
|
2021-03-19 14:23:37 +07:00
|
|
|
}
|
2017-08-17 16:17:37 +07:00
|
|
|
|
2021-03-19 14:23:37 +07:00
|
|
|
private void setIsFollowingAuthor(List<ArticleData> articles, User currentUser) {
|
|
|
|
Set<String> followingAuthors =
|
|
|
|
userRelationshipQueryService.followingAuthors(
|
2017-08-17 16:17:37 +07:00
|
|
|
currentUser.getId(),
|
2021-03-19 14:23:37 +07:00
|
|
|
articles.stream()
|
|
|
|
.map(articleData1 -> articleData1.getProfileData().getId())
|
|
|
|
.collect(toList()));
|
|
|
|
articles.forEach(
|
|
|
|
articleData -> {
|
|
|
|
if (followingAuthors.contains(articleData.getProfileData().getId())) {
|
|
|
|
articleData.getProfileData().setFollowing(true);
|
|
|
|
}
|
2017-08-17 16:17:37 +07:00
|
|
|
});
|
2021-03-19 14:23:37 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
private void setFavoriteCount(List<ArticleData> articles) {
|
|
|
|
List<ArticleFavoriteCount> favoritesCounts =
|
|
|
|
articleFavoritesReadService.articlesFavoriteCount(
|
|
|
|
articles.stream().map(ArticleData::getId).collect(toList()));
|
|
|
|
Map<String, Integer> countMap = new HashMap<>();
|
|
|
|
favoritesCounts.forEach(
|
|
|
|
item -> {
|
|
|
|
countMap.put(item.getId(), item.getCount());
|
2017-08-17 16:17:37 +07:00
|
|
|
});
|
2021-03-19 14:23:37 +07:00
|
|
|
articles.forEach(
|
|
|
|
articleData -> articleData.setFavoritesCount(countMap.get(articleData.getId())));
|
|
|
|
}
|
|
|
|
|
|
|
|
private void setIsFavorite(List<ArticleData> articles, User currentUser) {
|
|
|
|
Set<String> favoritedArticles =
|
|
|
|
articleFavoritesReadService.userFavorites(
|
|
|
|
articles.stream().map(articleData -> articleData.getId()).collect(toList()),
|
|
|
|
currentUser);
|
|
|
|
|
|
|
|
articles.forEach(
|
|
|
|
articleData -> {
|
|
|
|
if (favoritedArticles.contains(articleData.getId())) {
|
|
|
|
articleData.setFavorited(true);
|
|
|
|
}
|
2017-08-17 16:17:37 +07:00
|
|
|
});
|
2021-03-19 14:23:37 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
private void fillExtraInfo(String id, User user, ArticleData articleData) {
|
|
|
|
articleData.setFavorited(articleFavoritesReadService.isUserFavorite(user.getId(), id));
|
|
|
|
articleData.setFavoritesCount(articleFavoritesReadService.articleFavoriteCount(id));
|
|
|
|
articleData
|
|
|
|
.getProfileData()
|
|
|
|
.setFollowing(
|
2017-08-15 10:21:55 +07:00
|
|
|
userRelationshipQueryService.isUserFollowing(
|
2021-03-19 14:23:37 +07:00
|
|
|
user.getId(), articleData.getProfileData().getId()));
|
|
|
|
}
|
2017-08-15 09:47:18 +07:00
|
|
|
}
|