Skip to content

Commit

Permalink
Merge pull request #548 from Travel-in-nanaland/refactor/#545-popular…
Browse files Browse the repository at this point in the history
…-post-experience-category

[#545] refactor: 지난주 인기 게시물 experience 카테고리 세분화
  • Loading branch information
Te-H0 authored Jan 20, 2025
2 parents bd07cea + 2d566fc commit ee82bed
Show file tree
Hide file tree
Showing 13 changed files with 75 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class PopularPostPreviewDto {
description = "게시물 카테고리",
example = "NATURE",
allowableValues = {
"NATURE", "EXPERIENCE", "FESTIVAL", "MARKET", "RESTAURANT"
"NATURE", "ACTIVITY", "CULTURE_AND_ARTS", "FESTIVAL", "MARKET", "RESTAURANT"
})
private String category;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import com.jeju.nanaland.domain.common.data.Language;
import com.jeju.nanaland.domain.common.dto.PopularPostPreviewDto;
import com.jeju.nanaland.domain.common.repository.PostRepository;
import com.jeju.nanaland.domain.experience.entity.Experience;
import com.jeju.nanaland.domain.experience.entity.enums.ExperienceType;
import com.jeju.nanaland.domain.experience.repository.ExperienceRepository;
import com.jeju.nanaland.domain.favorite.service.MemberFavoriteService;
import com.jeju.nanaland.domain.festival.repository.FestivalRepository;
Expand All @@ -15,10 +17,12 @@
import com.jeju.nanaland.domain.member.entity.Member;
import com.jeju.nanaland.domain.nature.repository.NatureRepository;
import com.jeju.nanaland.domain.restaurant.repository.RestaurantRepository;
import com.jeju.nanaland.global.exception.ErrorCode;
import com.jeju.nanaland.global.util.RedisUtil;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.annotation.Scheduled;
Expand Down Expand Up @@ -76,7 +80,7 @@ public List<PopularPostPreviewDto> getLastWeekPopularPosts(MemberInfoDto memberI

// 좋아요 여부 추가
setPopularPostPreviewDtosFavoriteStatus(memberInfoDto, popularPostPreviewDtos);

return popularPostPreviewDtos;

}
Expand Down Expand Up @@ -107,15 +111,17 @@ public void setPopularPosts() throws JsonProcessingException {
// 카테고리별 top 3 게시물 조회
List<PopularPostPreviewDto> popularKoreanPostPreviewDtos = new ArrayList<>();
popularKoreanPostPreviewDtos.addAll(
experienceRepository.findAllTop3PopularPostPreviewDtoByLanguage(Language.KOREAN));
experienceRepository.findAllTop3PopularPostPreviewDtoByLanguage(Language.KOREAN,
excludeIds));
popularKoreanPostPreviewDtos.addAll(
festivalRepository.findAllTop3PopularPostPreviewDtoByLanguage(Language.KOREAN));
festivalRepository.findAllTop3PopularPostPreviewDtoByLanguage(Language.KOREAN, excludeIds));
popularKoreanPostPreviewDtos.addAll(
marketRepository.findAllTop3PopularPostPreviewDtoByLanguage(Language.KOREAN));
marketRepository.findAllTop3PopularPostPreviewDtoByLanguage(Language.KOREAN, excludeIds));
popularKoreanPostPreviewDtos.addAll(
natureRepository.findAllTop3PopularPostPreviewDtoByLanguage(Language.KOREAN));
natureRepository.findAllTop3PopularPostPreviewDtoByLanguage(Language.KOREAN, excludeIds));
popularKoreanPostPreviewDtos.addAll(
restaurantRepository.findAllTop3PopularPostPreviewDtoByLanguage(Language.KOREAN));
restaurantRepository.findAllTop3PopularPostPreviewDtoByLanguage(Language.KOREAN,
excludeIds));

// 조회수가 0이 아니고, excludeIds 제외환 게시물이 3개 미달이면
int postsSize = popularKoreanPostPreviewDtos.size();
Expand All @@ -134,24 +140,32 @@ public void setPopularPosts() throws JsonProcessingException {
Comparator.comparing(PopularPostPreviewDto::getViewCount).reversed());
popularKoreanPostPreviewDtos = popularKoreanPostPreviewDtos.subList(0, 3);

// address 형태 변환
popularKoreanPostPreviewDtos = modifyAddressTagToLongForm(popularKoreanPostPreviewDtos,
Language.KOREAN);
// 한국 게시물 redis에 저장
setJsonPopularPosts(Language.KOREAN, serializePostPreviewDtos(popularKoreanPostPreviewDtos));

// 한국어 게시물을 바탕으로 언어별로 조회
for (Language language : Language.values()) {
if (!language.equals(Language.KOREAN)) {
List<PopularPostPreviewDto> popularPostPreviewDto = getPopularPostPreviewDtosByKoreanPostsAndLanguage(
List<PopularPostPreviewDto> popularPostPreviewDtos = getPopularPostPreviewDtosByKoreanPostsAndLanguage(
popularKoreanPostPreviewDtos, language);

// Experience인 경우 category 수정
modifyPopularPostExperienceCategory(popularPostPreviewDtos);

// address 형태 변환
popularPostPreviewDto = modifyAddressTagToLongForm(popularPostPreviewDto, language);
popularPostPreviewDtos = modifyAddressTagToLongForm(popularPostPreviewDtos, language);

// 레디스에 저장
setJsonPopularPosts(language, serializePostPreviewDtos(popularPostPreviewDto));
setJsonPopularPosts(language, serializePostPreviewDtos(popularPostPreviewDtos));
}
}

// Experience인 경우 category 수정
modifyPopularPostExperienceCategory(popularKoreanPostPreviewDtos);

// address 형태 변환
popularKoreanPostPreviewDtos = modifyAddressTagToLongForm(popularKoreanPostPreviewDtos,
Language.KOREAN);

// 한국 게시물 redis에 저장
setJsonPopularPosts(Language.KOREAN, serializePostPreviewDtos(popularKoreanPostPreviewDtos));

}

Expand Down Expand Up @@ -261,13 +275,31 @@ private void setPopularPostPreviewDtosFavoriteStatus(MemberInfoDto memberInfoDto

// 각 PopularPostPreviewDto의 favorite 상태를 설정
popularPostPreviewDtos.forEach(postDto -> {
String category = postDto.getCategory();
if (Objects.equals(category, ExperienceType.ACTIVITY.name()) || Objects.equals(category,
ExperienceType.CULTURE_AND_ARTS.name())) {
category = Category.EXPERIENCE.name();
}
boolean isFavorite = memberFavoriteService.isPostInFavorite(
member,
Category.valueOf(postDto.getCategory()),
Category.valueOf(category),
postDto.getId()
);
postDto.setFavorite(isFavorite);
});
}

// Experience일 경우 category EXPERIENCE -> ACTIVITY, CULTURE_AND_ARTS 수정
private void modifyPopularPostExperienceCategory(
List<PopularPostPreviewDto> popularPostPreviewDtos) {
for (PopularPostPreviewDto PopularPostPreviewDto : popularPostPreviewDtos) {
if (Objects.equals(PopularPostPreviewDto.getCategory(), Category.EXPERIENCE.name())) {
Experience experience = experienceRepository.findById(PopularPostPreviewDto.getId())
.orElseThrow(() -> new RuntimeException(
ErrorCode.NOT_FOUND_EXCEPTION.getMessage()));
PopularPostPreviewDto.setCategory(experience.getExperienceType().name());
}
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ List<SearchPostForReviewDto> findAllSearchCultureAndArtsPostForReviewDtoByLangua

PostPreviewDto findPostPreviewDto(Long postId, Language language);

List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language);
List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds);

PopularPostPreviewDto findRandomPopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,8 @@ public PostPreviewDto findPostPreviewDto(Long postId, Language language) {


@Override
public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language) {
public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds) {
return queryFactory
.select(
new QPopularPostPreviewDto(experience.id, experienceTrans.title,
Expand All @@ -390,6 +391,7 @@ public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(La
.where(
experience.id.eq(post.id),
experienceTrans.language.eq(language),
experience.id.notIn(excludeIds),
post.viewCount.gt(0))
.orderBy(post.viewCount.desc())
.limit(3)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ Page<FestivalCompositeDto> searchCompositeDtoByMonth(Language locale, Pageable p

PostPreviewDto findPostPreviewDto(Long postId, Language language);

List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language);
List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds);

PopularPostPreviewDto findRandomPopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -456,7 +456,8 @@ public PostPreviewDto findPostPreviewDto(Long postId, Language language) {
}

@Override
public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language) {
public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds) {
return queryFactory
.select(
new QPopularPostPreviewDto(festival.id, festivalTrans.title,
Expand All @@ -472,6 +473,7 @@ public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(La
.where(
festival.id.eq(post.id),
festivalTrans.language.eq(language),
festival.id.notIn(excludeIds),
post.viewCount.gt(0))
.orderBy(post.viewCount.desc())
.limit(3)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ Page<MarketThumbnail> findMarketThumbnails(Language locale, List<AddressTag> add

PostPreviewDto findPostPreviewDto(Long postId, Language language);

List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language);
List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds);

PopularPostPreviewDto findRandomPopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,8 @@ public PostPreviewDto findPostPreviewDto(Long postId, Language language) {
}

@Override
public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language) {
public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds) {
return queryFactory
.select(
new QPopularPostPreviewDto(market.id, marketTrans.title,
Expand All @@ -301,6 +302,7 @@ public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(La
.where(
market.id.eq(post.id),
marketTrans.language.eq(language),
market.id.notIn(excludeIds),
post.viewCount.gt(0))
.orderBy(post.viewCount.desc())
.limit(3)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ Page<PreviewDto> findAllNaturePreviewDtoOrderByPriorityAndCreatedAtDesc(Language

PostPreviewDto findPostPreviewDto(Long postId, Language language);

List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language);
List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds);

PopularPostPreviewDto findRandomPopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,8 @@ public PostPreviewDto findPostPreviewDto(Long natureId, Language language) {
}

@Override
public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language) {
public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds) {
return queryFactory
.select(
new QPopularPostPreviewDto(nature.id, natureTrans.title,
Expand All @@ -334,6 +335,7 @@ public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(La
.where(
nature.id.eq(post.id),
natureTrans.language.eq(language),
nature.id.notIn(excludeIds),
post.viewCount.gt(0))
.orderBy(post.viewCount.desc())
.limit(3)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ Page<RestaurantThumbnail> findRestaurantThumbnails(Language language,

PostPreviewDto findPostPreviewDto(Long postId, Language language);

List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language);
List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds);

PopularPostPreviewDto findRandomPopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,8 @@ public PostPreviewDto findPostPreviewDto(Long postId, Language language) {
}

@Override
public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language) {
public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(Language language,
List<Long> excludeIds) {
return queryFactory
.select(
new QPopularPostPreviewDto(restaurant.id, restaurantTrans.title,
Expand All @@ -379,6 +380,7 @@ public List<PopularPostPreviewDto> findAllTop3PopularPostPreviewDtoByLanguage(La
.where(
restaurant.id.eq(post.id),
restaurantTrans.language.eq(language),
restaurant.id.notIn(excludeIds),
post.viewCount.gt(0))
.orderBy(post.viewCount.desc())
.limit(3)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public enum ErrorCode {
MAIL_FAIL_ERROR(INTERNAL_SERVER_ERROR, "메일 전송 실패"),
FILE_FAIL_ERROR(INTERNAL_SERVER_ERROR, "파일 변환 중 오류가 발생했습니다."),
FILE_UPLOAD_FAIL(INTERNAL_SERVER_ERROR, "파일 업로드 실패"),
POPULAR_POSTS_SIZE_DIFFERENT(INTERNAL_SERVER_ERROR, "언어 별 인기 게시물 크기가 다릅니다."),

//UNAUTHORIZED
UNAUTHORIZED_USER(UNAUTHORIZED, "access token이 존재하지 않습니다."),
Expand Down

0 comments on commit ee82bed

Please sign in to comment.