1. 메인화면에 필요한 게시물 리스트 조회 로직과 화면 렌더링 구현 2. 조회수순으로 메인화면 노출과 최신 업로드 순 게시물 노출 로직 구분 3. 무한스크롤 구현 4. 스크롤 화살표 구현 5. 계층형 카테고리 개발과 화면 렌더링 완료 - 롤업함수와 백트래킹으로 구현
89 lines
2.9 KiB
Java
89 lines
2.9 KiB
Java
package myblog.blog.article.service;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
import myblog.blog.article.domain.Article;
|
|
import myblog.blog.article.dto.ArticleForMainView;
|
|
import myblog.blog.article.dto.NewArticleDto;
|
|
import myblog.blog.article.repository.ArticleRepository;
|
|
import myblog.blog.category.service.CategoryService;
|
|
import myblog.blog.member.doamin.Member;
|
|
import myblog.blog.member.repository.MemberRepository;
|
|
import myblog.blog.member.service.Oauth2MemberService;
|
|
import myblog.blog.tags.service.TagsService;
|
|
import org.modelmapper.ModelMapper;
|
|
import org.springframework.data.domain.PageRequest;
|
|
import org.springframework.data.domain.Slice;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
import javax.annotation.PostConstruct;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.UUID;
|
|
|
|
@Service
|
|
@Transactional
|
|
@RequiredArgsConstructor
|
|
public class ArticleService {
|
|
|
|
private final ArticleRepository
|
|
articleRepository;
|
|
private final MemberRepository memberRepository;
|
|
private final TagsService tagsService;
|
|
private final CategoryService categoryService;
|
|
private final Oauth2MemberService memberService;
|
|
private final ModelMapper modelMapper;
|
|
|
|
public Long writeArticle(NewArticleDto articleDto) {
|
|
|
|
Article newArticle = createNewArticleFrom(articleDto);
|
|
|
|
articleRepository.save(newArticle);
|
|
tagsService.createNewTagsAndArticleTagList(articleDto.getTags(), newArticle);
|
|
|
|
return newArticle.getId();
|
|
|
|
}
|
|
|
|
public List<ArticleForMainView> getPopularArticles() {
|
|
List<Article> top6ByOrderByHitDesc = articleRepository.findTop6ByOrderByHitDesc();
|
|
|
|
List<ArticleForMainView> articles = new ArrayList<>();
|
|
|
|
for (Article article : top6ByOrderByHitDesc) {
|
|
articles.add(modelMapper.map(article, ArticleForMainView.class));
|
|
}
|
|
|
|
|
|
return articles;
|
|
|
|
}
|
|
|
|
public Slice<ArticleForMainView> getRecentArticles(int page) {
|
|
|
|
return articleRepository.findByOrderByCreatedDateDesc(PageRequest.of(page, 5))
|
|
.map(article -> modelMapper.map(article, ArticleForMainView.class));
|
|
|
|
}
|
|
|
|
private Article createNewArticleFrom(NewArticleDto articleDto) {
|
|
Member member =
|
|
memberRepository.findById(articleDto.getMemberId()).orElseThrow(() -> {
|
|
throw new IllegalArgumentException("작성자를 확인할 수 없습니다");
|
|
});
|
|
|
|
return Article.builder()
|
|
.title(articleDto.getTitle())
|
|
.content(articleDto.getContent())
|
|
.toc(articleDto.getToc())
|
|
.thumbnailUrl(articleDto.getThumbnailUrl())
|
|
.category(categoryService.findCategory(articleDto.getCategory()))
|
|
.member(member)
|
|
.build();
|
|
}
|
|
|
|
/*--------------------------------------------------------------------------------------------*/
|
|
|
|
|
|
}
|