리팩토링, 퍼사드 패턴 고려중
This commit is contained in:
@@ -7,16 +7,16 @@ import myblog.blog.article.application.port.incomming.TagsQueriesUseCase;
|
||||
import myblog.blog.category.appliacation.port.incomming.CategoryQueriesUseCase;
|
||||
import myblog.blog.shared.application.port.incomming.LayoutRenderingUseCase;
|
||||
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleCreateRequest;
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleEditRequest;
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleCreateCommand;
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleEditCommand;
|
||||
import myblog.blog.article.application.port.incomming.response.ArticleResponseByCategory;
|
||||
import myblog.blog.article.application.port.incomming.response.ArticleResponseForCardBox;
|
||||
import myblog.blog.article.application.port.incomming.response.ArticleResponseForDetail;
|
||||
import myblog.blog.article.application.port.incomming.response.ArticleResponseForEdit;
|
||||
import myblog.blog.category.appliacation.port.incomming.response.CategoryViewForLayout;
|
||||
import myblog.blog.member.application.port.incomming.response.PrincipalDetails;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import myblog.blog.shared.utils.MetaTagBuildUtils;
|
||||
import org.jsoup.Jsoup;
|
||||
import org.springframework.data.domain.*;
|
||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||
@@ -51,18 +51,15 @@ public class ArticleController {
|
||||
model.addAttribute("articleDto", new ArticleForm());
|
||||
return "article/articleWriteForm";
|
||||
}
|
||||
/*
|
||||
- 아티클 작성 post 요청
|
||||
*/
|
||||
|
||||
@PostMapping("article/write")
|
||||
@Transactional
|
||||
String writeArticle(@Validated ArticleForm articleForm,
|
||||
@AuthenticationPrincipal PrincipalDetails principal,
|
||||
Errors errors, Model model) {
|
||||
if (errors.hasErrors()) {
|
||||
getArticleWriteForm(model);
|
||||
}
|
||||
Long articleId = articleUseCase.writeArticle(ArticleCreateRequest.from(articleForm,principal.getMemberId()));
|
||||
@AuthenticationPrincipal PrincipalDetails principal,
|
||||
Errors errors, Model model) {
|
||||
if (errors.hasErrors()) getArticleWriteForm(model);
|
||||
var command = ArticleCreateCommand.from(articleForm, principal.getMemberId());
|
||||
Long articleId = articleUseCase.writeArticle(command);
|
||||
articleUseCase.backupArticle(articleId);
|
||||
tempArticleUseCase.deleteTemp();
|
||||
return "redirect:/article/view?articleId=" + articleId;
|
||||
@@ -79,19 +76,14 @@ public class ArticleController {
|
||||
model.addAttribute("articleDto", articleDto);
|
||||
return "article/articleEditForm";
|
||||
}
|
||||
/*
|
||||
- 아티클 수정 요청
|
||||
*/
|
||||
@PostMapping("/article/edit")
|
||||
@Transactional
|
||||
String editArticle(@RequestParam Long articleId,
|
||||
@ModelAttribute ArticleForm articleForm) {
|
||||
articleUseCase.editArticle(ArticleEditRequest.from(articleId, articleForm));
|
||||
var command = ArticleEditCommand.from(articleId, articleForm);
|
||||
articleUseCase.editArticle(command);
|
||||
return "redirect:/article/view?articleId=" + articleId;
|
||||
}
|
||||
/*
|
||||
- 아티클 삭제 요청
|
||||
*/
|
||||
@PostMapping("/article/delete")
|
||||
@Transactional
|
||||
String deleteArticle(@RequestParam Long articleId) {
|
||||
@@ -107,34 +99,24 @@ public class ArticleController {
|
||||
@RequestParam int tier,
|
||||
@RequestParam int page,
|
||||
Model model) {
|
||||
PagingBoxHandler pagingBoxHandler =
|
||||
var pagingBoxHandler =
|
||||
PagingBoxHandler.createOf(page, getTotalArticleCntByCategory(category, categoryQueriesUseCase.getCategoryViewForLayout()));
|
||||
|
||||
List<ArticleResponseForCardBox> articleDtoList =
|
||||
articleQueriesUseCase.getArticlesByCategory(category, tier, pagingBoxHandler.getCurPageNum());
|
||||
|
||||
for(ArticleResponseForCardBox articleDto : articleDtoList){
|
||||
var articleDtoList = articleQueriesUseCase.getArticlesByCategory(category, tier, pagingBoxHandler.getCurPageNum());
|
||||
for(var articleDto : articleDtoList){
|
||||
articleDto.setContent(Jsoup.parse(getHtmlRenderer().render(getParser().parse(articleDto.getContent()))).text());
|
||||
}
|
||||
|
||||
layoutRenderingUseCase.AddLayoutTo(model);
|
||||
model.addAttribute("pagingBox", pagingBoxHandler);
|
||||
model.addAttribute("articleList", articleDtoList);
|
||||
|
||||
return "article/articleList";
|
||||
}
|
||||
private int getTotalArticleCntByCategory(String category, CategoryViewForLayout categorys) {
|
||||
|
||||
if (categorys.getTitle().equals(category)) {
|
||||
return categorys.getCount();
|
||||
} else {
|
||||
for (CategoryViewForLayout categoryCnt :
|
||||
categorys.getCategoryTCountList()) {
|
||||
if (categoryCnt.getTitle().equals(category))
|
||||
return categoryCnt.getCount();
|
||||
for (CategoryViewForLayout categoryCntSub : categoryCnt.getCategoryTCountList()) {
|
||||
if (categoryCntSub.getTitle().equals(category))
|
||||
return categoryCntSub.getCount();
|
||||
if (categorys.getTitle().equals(category)) return categorys.getCount();
|
||||
else {
|
||||
for (var categoryCnt : categorys.getCategoryTCountList()) {
|
||||
if (categoryCnt.getTitle().equals(category)) return categoryCnt.getCount();
|
||||
for (var categoryCntSub : categoryCnt.getCategoryTCountList()) {
|
||||
if (categoryCntSub.getTitle().equals(category)) return categoryCntSub.getCount();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -143,51 +125,36 @@ public class ArticleController {
|
||||
/*
|
||||
- 태그별 게시물 조회하기
|
||||
*/
|
||||
@Transactional
|
||||
@GetMapping("article/list/tag/")
|
||||
String getArticlesListByTag(@RequestParam Integer page,
|
||||
@RequestParam String tagName,
|
||||
Model model) {
|
||||
Page<ArticleResponseForCardBox> articleList =
|
||||
articleQueriesUseCase.getArticlesByTag(tagName, page);
|
||||
|
||||
Page<ArticleResponseForCardBox> articleList = articleQueriesUseCase.getArticlesByTag(tagName, page);
|
||||
for(ArticleResponseForCardBox article : articleList){
|
||||
article.setContent(Jsoup.parse(getHtmlRenderer().render(getParser().parse(article.getContent()))).text());
|
||||
}
|
||||
|
||||
PagingBoxHandler pagingBoxHandler =
|
||||
PagingBoxHandler.createOf(page, (int)articleList.getTotalElements());
|
||||
|
||||
var pagingBoxHandler = PagingBoxHandler.createOf(page, (int)articleList.getTotalElements());
|
||||
layoutRenderingUseCase.AddLayoutTo(model);
|
||||
model.addAttribute("articleList", articleList);
|
||||
model.addAttribute("pagingBox", pagingBoxHandler);
|
||||
|
||||
return "article/articleListByTag";
|
||||
}
|
||||
/*
|
||||
- 검색어별 게시물 조회하기
|
||||
*/
|
||||
@Transactional
|
||||
@GetMapping("article/list/search/")
|
||||
String getArticlesListByKeyword(@RequestParam Integer page,
|
||||
@RequestParam String keyword,
|
||||
Model model) {
|
||||
Page<ArticleResponseForCardBox> articleList =
|
||||
articleQueriesUseCase.getArticlesByKeyword(keyword, page);
|
||||
|
||||
Page<ArticleResponseForCardBox> articleList = articleQueriesUseCase.getArticlesByKeyword(keyword, page);
|
||||
for(ArticleResponseForCardBox article : articleList){
|
||||
article.setContent(Jsoup.parse(getHtmlRenderer().render(getParser().parse(article.getContent()))).text());
|
||||
}
|
||||
|
||||
PagingBoxHandler pagingBoxHandler =
|
||||
PagingBoxHandler.createOf(page, (int)articleList.getTotalElements());
|
||||
|
||||
var pagingBoxHandler = PagingBoxHandler.createOf(page, (int)articleList.getTotalElements());
|
||||
layoutRenderingUseCase.AddLayoutTo(model);
|
||||
model.addAttribute("articleList", articleList);
|
||||
model.addAttribute("pagingBox", pagingBoxHandler);
|
||||
|
||||
return "article/articleListByKeyword";
|
||||
|
||||
}
|
||||
/*
|
||||
- 아티클 상세 조회
|
||||
@@ -202,49 +169,40 @@ public class ArticleController {
|
||||
String readArticle(@RequestParam Long articleId,
|
||||
@AuthenticationPrincipal PrincipalDetails principal,
|
||||
@CookieValue(required = false, name = "view") String cookie,
|
||||
HttpServletResponse response,
|
||||
Model model) {
|
||||
// 1. 로그인 여부에 따라 뷰단에 회원정보 출력 여부 결정
|
||||
if (principal != null) {
|
||||
model.addAttribute("member", principal.getMember());
|
||||
} else {
|
||||
model.addAttribute("member", null);
|
||||
}
|
||||
|
||||
/*
|
||||
2.화면단을 위한 처리
|
||||
*/
|
||||
ArticleResponseForDetail articleResponseForDetail = articleQueriesUseCase.getArticleForDetail(articleId);
|
||||
articleResponseForDetail.setContent(getHtmlRenderer().render(getParser().parse(articleResponseForDetail.getContent())));
|
||||
|
||||
List<ArticleResponseByCategory> articleTitlesSortByCategory =
|
||||
articleQueriesUseCase
|
||||
HttpServletResponse response, Model model) {
|
||||
addMemberInfoToModel(principal, model);
|
||||
var articleResponseForDetail = articleQueriesUseCase.getArticleForDetail(articleId);
|
||||
articleResponseForDetail.parseAndRenderForView(articleResponseForDetail.getContent());
|
||||
List<ArticleResponseByCategory> articleTitlesSortByCategory = articleQueriesUseCase
|
||||
.getArticlesByCategoryForDetailView(articleResponseForDetail.getCategory());
|
||||
|
||||
// 3. 메타 태그용 Dto 전처리
|
||||
StringBuilder metaTags = new StringBuilder();
|
||||
for (String tag : articleResponseForDetail.getTags()) {
|
||||
metaTags.append(tag).append(", ");
|
||||
}
|
||||
|
||||
String substringContents = null;
|
||||
if(articleResponseForDetail.getContent().length()>200) {
|
||||
substringContents = articleResponseForDetail.getContent().substring(0, 200);
|
||||
}
|
||||
else substringContents = articleResponseForDetail.getContent();
|
||||
|
||||
// 4. 모델 담기
|
||||
String metaTags = MetaTagBuildUtils.buildMetaTags(articleResponseForDetail.getTags());
|
||||
String substringContents = getSubStringContentsFrom(articleResponseForDetail.getContent());
|
||||
layoutRenderingUseCase.AddLayoutTo(model);
|
||||
model.addAttribute("article", articleResponseForDetail);
|
||||
model.addAttribute("metaTags",metaTags);
|
||||
model.addAttribute("metaContents",Jsoup.parse(substringContents).text());
|
||||
model.addAttribute("articlesSortBycategory", articleTitlesSortByCategory);
|
||||
|
||||
// 5. 조회수 증가 검토 및 증가
|
||||
if(needToAddHitThroughCheckingCookie(articleId, cookie, response)) articleUseCase.addHit(articleId);
|
||||
|
||||
return "article/articleView";
|
||||
}
|
||||
|
||||
private void addMemberInfoToModel(PrincipalDetails principal, Model model) {
|
||||
if (principal != null) {
|
||||
model.addAttribute("member", principal.getMember());
|
||||
} else {
|
||||
model.addAttribute("member", null);
|
||||
}
|
||||
}
|
||||
|
||||
private String getSubStringContentsFrom(String content) {
|
||||
String substringContents = null;
|
||||
if(content.length()>200) {
|
||||
substringContents = content.substring(0, 200);
|
||||
}
|
||||
else substringContents = content;
|
||||
return substringContents;
|
||||
}
|
||||
|
||||
/*
|
||||
- 쿠키 추가 / 조회수 증가 검토
|
||||
*/
|
||||
|
||||
@@ -2,8 +2,8 @@ package myblog.blog.article.application;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleCreateRequest;
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleEditRequest;
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleCreateCommand;
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleEditCommand;
|
||||
import myblog.blog.article.application.port.incomming.ArticleUseCase;
|
||||
import myblog.blog.article.application.port.incomming.TagUseCase;
|
||||
import myblog.blog.category.appliacation.port.incomming.CategoryUseCase;
|
||||
@@ -35,32 +35,32 @@ public class ArticleService implements ArticleUseCase {
|
||||
|
||||
@Override
|
||||
@CacheEvict(value = {"layoutCaching", "layoutRecentArticleCaching","seoCaching"}, allEntries = true)
|
||||
public Long writeArticle(ArticleCreateRequest articleCreateRequest) {
|
||||
Member writer = memberQueriesUseCase.findById(articleCreateRequest.getMemberId());
|
||||
Category category = categoryUseCase.findCategory(articleCreateRequest.getCategory());
|
||||
Article newArticle = new Article(articleCreateRequest.getTitle(),
|
||||
articleCreateRequest.getContent(),
|
||||
articleCreateRequest.getToc(),
|
||||
public Long writeArticle(ArticleCreateCommand articleCreateCommand) {
|
||||
Member writer = memberQueriesUseCase.findById(articleCreateCommand.getMemberId());
|
||||
Category category = categoryUseCase.findCategory(articleCreateCommand.getCategory());
|
||||
Article newArticle = new Article(articleCreateCommand.getTitle(),
|
||||
articleCreateCommand.getContent(),
|
||||
articleCreateCommand.getToc(),
|
||||
writer,
|
||||
articleCreateRequest.getThumbnailUrl(),
|
||||
articleCreateCommand.getThumbnailUrl(),
|
||||
category);
|
||||
articleRepositoryPort.save(newArticle);
|
||||
tagUseCase.createNewTagsAndArticleTagList(articleCreateRequest.getTags(), newArticle);
|
||||
tagUseCase.createNewTagsAndArticleTagList(articleCreateCommand.getTags(), newArticle);
|
||||
return newArticle.getId();
|
||||
}
|
||||
|
||||
@Override
|
||||
@CacheEvict(value = {"layoutCaching", "layoutRecentArticleCaching","seoCaching"}, allEntries = true)
|
||||
public void editArticle(ArticleEditRequest articleEditRequest) {
|
||||
Article article = articleRepositoryPort.findById(articleEditRequest.getArticleId())
|
||||
public void editArticle(ArticleEditCommand articleEditCommand) {
|
||||
Article article = articleRepositoryPort.findById(articleEditCommand.getArticleId())
|
||||
.orElseThrow(() -> new IllegalArgumentException("NotFoundArticleException"));
|
||||
Category category = categoryUseCase.findCategory(articleEditRequest.getCategoryName());
|
||||
Category category = categoryUseCase.findCategory(articleEditCommand.getCategoryName());
|
||||
tagUseCase.deleteAllTagsWith(article);
|
||||
tagUseCase.createNewTagsAndArticleTagList(articleEditRequest.getTags(), article);
|
||||
article.edit(articleEditRequest.getContent(),
|
||||
articleEditRequest.getTitle(),
|
||||
articleEditRequest.getToc(),
|
||||
articleEditRequest.getThumbnailUrl(), category);
|
||||
tagUseCase.createNewTagsAndArticleTagList(articleEditCommand.getTags(), article);
|
||||
article.edit(articleEditCommand.getContent(),
|
||||
articleEditCommand.getTitle(),
|
||||
articleEditCommand.getToc(),
|
||||
articleEditCommand.getThumbnailUrl(), category);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
package myblog.blog.article.application.port.incomming;
|
||||
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleCreateRequest;
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleEditRequest;
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleCreateCommand;
|
||||
import myblog.blog.article.application.port.incomming.request.ArticleEditCommand;
|
||||
import myblog.blog.article.domain.Article;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface ArticleUseCase {
|
||||
Long writeArticle(ArticleCreateRequest articleCreateRequest);
|
||||
void editArticle(ArticleEditRequest articleEditRequest);
|
||||
Long writeArticle(ArticleCreateCommand articleCreateCommand);
|
||||
void editArticle(ArticleEditCommand articleEditCommand);
|
||||
void deleteArticle(Long articleId);
|
||||
void addHit(Long articleId);
|
||||
void backupArticle(Long articleId);
|
||||
|
||||
@@ -6,7 +6,7 @@ import myblog.blog.article.adapter.incomming.ArticleForm;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public class ArticleCreateRequest {
|
||||
public class ArticleCreateCommand {
|
||||
private Long memberId;
|
||||
private String title;
|
||||
private String content;
|
||||
@@ -15,8 +15,8 @@ public class ArticleCreateRequest {
|
||||
private String category;
|
||||
private String tags;
|
||||
|
||||
static public ArticleCreateRequest from(ArticleForm articleForm, Long memberId){
|
||||
return new ArticleCreateRequest(memberId,
|
||||
static public ArticleCreateCommand from(ArticleForm articleForm, Long memberId){
|
||||
return new ArticleCreateCommand(memberId,
|
||||
articleForm.getTitle(),
|
||||
articleForm.getContent(),
|
||||
articleForm.getToc(),
|
||||
@@ -6,7 +6,7 @@ import myblog.blog.article.adapter.incomming.ArticleForm;
|
||||
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public class ArticleEditRequest {
|
||||
public class ArticleEditCommand {
|
||||
|
||||
private Long articleId;
|
||||
private String title;
|
||||
@@ -16,8 +16,8 @@ public class ArticleEditRequest {
|
||||
private String categoryName;
|
||||
private String tags;
|
||||
|
||||
static public ArticleEditRequest from(Long articleId, ArticleForm articleForm){
|
||||
return new ArticleEditRequest(articleId,
|
||||
static public ArticleEditCommand from(Long articleId, ArticleForm articleForm){
|
||||
return new ArticleEditCommand(articleId,
|
||||
articleForm.getTitle(),
|
||||
articleForm.getContent(),
|
||||
articleForm.getToc(),
|
||||
@@ -17,4 +17,6 @@ public class ArticleResponseForCardBox {
|
||||
private String thumbnailUrl;
|
||||
private LocalDateTime createdDate;
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -6,6 +6,9 @@ import lombok.Setter;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
import static myblog.blog.shared.utils.MarkdownUtils.getHtmlRenderer;
|
||||
import static myblog.blog.shared.utils.MarkdownUtils.getParser;
|
||||
|
||||
/*
|
||||
- 아티클 상세조회용 DTO
|
||||
*/
|
||||
@@ -21,4 +24,8 @@ public class ArticleResponseForDetail {
|
||||
private String category;
|
||||
private List<String> tags;
|
||||
private LocalDateTime createdDate;
|
||||
|
||||
public void parseAndRenderForView(String content){
|
||||
getHtmlRenderer().render(getParser().parse(content));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package myblog.blog.shared.utils;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class MetaTagBuildUtils {
|
||||
static public String buildMetaTags(List<String> tags){
|
||||
var metaTags = new StringBuilder();
|
||||
for (String tag : tags) {
|
||||
metaTags.append(tag).append(", ");
|
||||
}
|
||||
return metaTags.toString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user