Skip to content

Commit

Permalink
lmw7414#70 - 게시글 서비스의 해시태그 기능 변경점 반영
Browse files Browse the repository at this point in the history
테스트의 변화는 lmw7414#68 의 e9f36a4 에서 도메인 변경을 하면서
이미 구상하여 작업하였음

주로 게시글이 저장, 수정, 삭제될 때
해시태그가 함께 어떻게 움직여야 하는지를 묘사한다.

강의 진행하면서 도메인 변경이 얼마나 넓은 영역에
영향을 미치는지 보여주면서, 컴파일 에러를 해소하기 위해
일단 테스트 변경까지 모두 반영하게 되었다.

이런 과정을 거치면서
코드 작성 과정을 잘 구분하고 보여줄 시간이 부족하여
이런 커밋들이 발생했는데,
실전에서 이렇게 작업 내역을 나누면
커밋으로 이력을 추적하면서 볼 때 다소 불편할 것 같다.
또한 사이의 커밋이 테스트 실패하는
불완전한 상태로 진행된 것도 문제.

서비스의 변경은 테스트 변경과 함께 담길 수 있도록 하자.
  • Loading branch information
oyoungsun committed Jan 16, 2023
1 parent a08221e commit 5d5752d
Showing 1 changed file with 51 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package com.fastcampus.projectboard.service;

import com.fastcampus.projectboard.domain.Article;
import com.fastcampus.projectboard.domain.Hashtag;
import com.fastcampus.projectboard.domain.UserAccount;
import com.fastcampus.projectboard.domain.constant.SearchType;
import com.fastcampus.projectboard.dto.ArticleDto;
import com.fastcampus.projectboard.dto.ArticleWithCommentsDto;
import com.fastcampus.projectboard.repository.ArticleRepository;
import com.fastcampus.projectboard.repository.HashtagRepository;
import com.fastcampus.projectboard.repository.UserAccountRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand All @@ -17,13 +19,17 @@
import javax.persistence.EntityNotFoundException;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

@Slf4j
@RequiredArgsConstructor
@Transactional
@Service
public class ArticleService {

private final HashtagService hashtagService;
private final HashtagRepository hashtagRepository;
private final ArticleRepository articleRepository;
private final UserAccountRepository userAccountRepository;

Expand Down Expand Up @@ -60,8 +66,12 @@ public ArticleDto getArticle(Long articleId) {
}

public void saveArticle(ArticleDto dto) {
UserAccount userAccount = userAccountRepository.getReferenceById(dto.userAccountDto().userId());
articleRepository.save(dto.toEntity(userAccount));
UserAccount userAccount = userAccountRepository
.getReferenceById(dto.userAccountDto().userId());
Set<Hashtag> hashtags = renewHashtagsFromContent(dto.content());
Article article = dto.toEntity(userAccount);
article.addHashtags(hashtags);
articleRepository.save(article);
}

public void updateArticle(Long articleId, ArticleDto dto) {
Expand All @@ -76,31 +86,66 @@ public void updateArticle(Long articleId, ArticleDto dto) {
if (dto.content() != null) {
article.setContent(dto.content());
}
Set<Long> hashtagIds = article.getHashtags().stream()
.map(Hashtag::getId)
.collect(Collectors.toUnmodifiableSet());
article.clearHashtags();
articleRepository.flush();

hashtagIds.forEach(hashtagService::deleteHashtagWithoutArticles);

Set<Hashtag> hashtags = renewHashtagsFromContent(dto.content());
article.addHashtags(hashtags);
//게시글 업데이트 시 해시태그 다시 파싱한다음 해시태그 레포에 정리
}
} catch (EntityNotFoundException e) {
log.warn("게시글 업데이트 실패. 게시글을 수정하는데 필요한 정보를 찾을 수 없습니다 - {}", e.getLocalizedMessage());
}
}

public void deleteArticle(long articleId,String userId) {
Article article = articleRepository.getReferenceById(articleId);
Set<Long> hashtagIds = article.getHashtags().stream()
.map(Hashtag::getId)
.collect(Collectors.toUnmodifiableSet());
articleRepository.deleteByIdAndUserAccount_UserId(articleId, userId);
articleRepository.flush();

hashtagIds.forEach(hashtagService::deleteHashtagWithoutArticles);
}

public long getArticleCount() {
return articleRepository.count();
}

@Transactional(readOnly = true)
public Page<ArticleDto> searchArticlesViaHashtag(String hashtag, Pageable pageable) {
if (hashtag == null || hashtag.isBlank()) {
public Page<ArticleDto> searchArticlesViaHashtag(String hashtagName, Pageable pageable) {
if (hashtagName == null || hashtagName.isBlank()) {
return Page.empty(pageable);
}

return articleRepository.findByHashtagNames(null, pageable).map(ArticleDto::from);
return articleRepository.findByHashtagNames(List.of(hashtagName), pageable)
.map(ArticleDto::from);
}

public List<String> getHashtags() {
return articleRepository.findAllDistinctHashtags();
return hashtagRepository.findAllHashtagNames();
}

private Set<Hashtag> renewHashtagsFromContent(String content){
Set<String> hashtagNamesInContent =
hashtagService.parseHashtagNames(content);
Set<Hashtag> hashtags = hashtagService.findHashtagsByNames(hashtagNamesInContent);
//컨텐츠에서 다시 해시태그 파싱, 해시태그는 존재하는지 파악하고 새거면 추가
Set<String> existingHashtagNames = hashtags.stream()
.map(Hashtag::getHashtagName)
.collect(Collectors.toUnmodifiableSet());

hashtagNamesInContent.forEach(newHashtagName -> {
if (!existingHashtagNames.contains(newHashtagName)) {
hashtags.add(Hashtag.of(newHashtagName));
}
});
return hashtags;
}
}

0 comments on commit 5d5752d

Please sign in to comment.