Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FEAT] 이달의 랭킹 및 카테고리별 랭킹 구현 #78

Merged
merged 3 commits into from
Feb 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/generated/umc/IRECIPE_Server/entity/QPost.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ public class QPost extends EntityPathBase<Post> {

public final NumberPath<Float> score = createNumber("score", Float.class);

public final NumberPath<Float> scoreInOneMonth = createNumber("scoreInOneMonth", Float.class);

public final EnumPath<umc.IRECIPE_Server.common.enums.Status> status = createEnum("status", umc.IRECIPE_Server.common.enums.Status.class);

public final StringPath subhead = createString("subhead");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import umc.IRECIPE_Server.apiPayLoad.code.status.ErrorStatus;
import umc.IRECIPE_Server.apiPayLoad.exception.GeneralException;
import umc.IRECIPE_Server.common.S3.S3Service;
import umc.IRECIPE_Server.common.enums.Category;
import umc.IRECIPE_Server.converter.PostConverter;
import umc.IRECIPE_Server.dto.request.PostRequestDTO;
import umc.IRECIPE_Server.dto.response.PostResponseDTO;
Expand Down Expand Up @@ -154,6 +155,12 @@ public ApiResponse<?> postPaging() {
public ApiResponse<PostResponseDTO.findAllResultListDTO> getRankedPost(@RequestParam(name = "page") Integer page) {
Page<Post> ranking = postService.getRanking(page);
return ApiResponse.onSuccess(PostConverter.toFindAllResultListDTO(ranking));
}

@GetMapping("/ranking/{category}")
public ApiResponse<PostResponseDTO.findAllResultListDTO> getCategoryRankedPost(@RequestParam(name = "page") Integer page,
@PathVariable(name = "category") Category category) {
Page<Post> ranking = postService.getCategoryRanking(page, category);
return ApiResponse.onSuccess(PostConverter.toFindAllResultListDTO(ranking));
}
}
2 changes: 2 additions & 0 deletions src/main/java/umc/IRECIPE_Server/converter/PostConverter.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,12 +87,14 @@ public static PostResponseDTO.LikePostDTO toLikePostDTO(Post post) {
}

public static PostResponseDTO.getRankedPostDTO toGetRankedPostDTO(Post post) {

return PostResponseDTO.getRankedPostDTO.builder()
.postId(post.getId())
.title(post.getTitle())
.scores(post.getScore())
.likes(post.getLikes())
.imageUrl(post.getImageUrl())
.scoresInOneMonth(post.getScoreInOneMonth())
.build();

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ public static class getRankedPostDTO {
private String imageUrl;
private Integer likes;
private Float scores;
private Float scoresInOneMonth;
}
@Builder
@Getter
Expand Down
44 changes: 44 additions & 0 deletions src/main/java/umc/IRECIPE_Server/entity/Post.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@

import jakarta.persistence.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
Expand Down Expand Up @@ -63,6 +68,9 @@ public class Post extends BaseEntity {
// 평균 별점
private Float score;

//한달 평균 별점
private Float scoreInOneMonth;

@OneToMany(mappedBy = "post", cascade = CascadeType.ALL)
private List<Review> reviewList = new ArrayList<>();

Expand Down Expand Up @@ -107,4 +115,40 @@ public void updateStatus(Status status){
// 평균 별점 수정
public void updateScore(Float score) { this.score = score; }

public void updateScoreInOneMonth(Float score){
this.scoreInOneMonth = scoreInOneMonth;
}

// 이전 30일 동안의 리뷰를 제외한 평균 별점을 계산하는 메서드
public Float calculateAverageRatingExcludingLast30DaysReviews() {
// 현재 날짜와 시간을 가져옵니다.
LocalDateTime currentDateTime = LocalDateTime.now();

// 현재 날짜와 시간으로부터 30일 전의 LocalDateTime을 계산합니다.
LocalDateTime thirtyDaysAgoDateTime = currentDateTime.minusDays(30);

// 30일 전의 LocalDateTime을 LocalDate와 LocalTime으로 분리합니다.
LocalDate thirtyDaysAgoDate = thirtyDaysAgoDateTime.toLocalDate();
LocalTime midnight = LocalTime.MIDNIGHT;
LocalDateTime thirtyDaysAgo = LocalDateTime.of(thirtyDaysAgoDate, midnight);

// 이전 30일 동안의 리뷰를 필터링하여 가져옵니다.
List<Review> filteredReviews = reviewList.stream()
.filter(review -> review.getCreatedAt().isBefore(thirtyDaysAgo))
.collect(Collectors.toList());

// 이전 30일 동안의 리뷰를 제외한 리뷰들의 총 별점과 개수를 계산합니다.
float totalRatingExcludingLast30DaysReviews = 0;
int count = 0;
for (Review review : reviewList) {
if (!filteredReviews.contains(review)) {
totalRatingExcludingLast30DaysReviews += review.getScore();
count++;
}
}
System.out.println("count = " + count);
scoreInOneMonth = count > 0 ? totalRatingExcludingLast30DaysReviews / count : 0;
return scoreInOneMonth;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.query.Param;
import umc.IRECIPE_Server.common.enums.Category;
import umc.IRECIPE_Server.common.enums.Status;

import org.springframework.data.domain.PageRequest;
Expand All @@ -13,6 +15,7 @@
import umc.IRECIPE_Server.entity.Member;
import umc.IRECIPE_Server.entity.Post;

import java.time.LocalDateTime;
import java.util.List;

public interface PostRepository extends JpaRepository<Post, Long> {
Expand All @@ -30,8 +33,12 @@ public interface PostRepository extends JpaRepository<Post, Long> {

List<Post> findAllByMember(Member member);

@Query("select p from Post p order by p.score desc, p.likes desc")
@Query("select p from Post p where p.status = 'POST' " +
"order by p.scoreInOneMonth desc, p.likes desc")
Page<Post> findRankedPost(PageRequest pageRequest);

@Query("select p from Post p where p.status = 'POST' and p.category = :category " +
"order by p.scoreInOneMonth desc, p.likes desc")
Page<Post> findCategoryRankedPost(PageRequest pageRequest, @Param("category") Category category);
}

21 changes: 20 additions & 1 deletion src/main/java/umc/IRECIPE_Server/service/PostService.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,15 @@
import umc.IRECIPE_Server.apiPayLoad.code.status.ErrorStatus;
import umc.IRECIPE_Server.apiPayLoad.code.status.SuccessStatus;
import umc.IRECIPE_Server.apiPayLoad.exception.GeneralException;
import umc.IRECIPE_Server.common.enums.Category;
import umc.IRECIPE_Server.common.enums.Status;
import umc.IRECIPE_Server.converter.PostConverter;
import umc.IRECIPE_Server.dto.request.PostRequestDTO;
import umc.IRECIPE_Server.dto.response.PostResponseDTO;
import umc.IRECIPE_Server.entity.Member;
import umc.IRECIPE_Server.entity.MemberLikes;
import umc.IRECIPE_Server.entity.Post;
import umc.IRECIPE_Server.entity.Review;
import umc.IRECIPE_Server.repository.MemberLikesRepository;
import umc.IRECIPE_Server.repository.MemberRepository;
import umc.IRECIPE_Server.repository.PostRepository;
Expand All @@ -29,8 +31,12 @@

import javax.swing.text.html.Option;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
Expand Down Expand Up @@ -68,6 +74,7 @@ public ApiResponse<?> posting(String userId, PostRequestDTO.newRequestDTO postRe
.imageUrl(url)
.fileName(fileName)
.status(postRequestDto.getStatus())
.score(0.0F)
.build();

// 게시글 저장
Expand Down Expand Up @@ -242,9 +249,21 @@ else if(type.equals("writer")){
}

public Page<Post> getRanking(Integer page) {
PageRequest pageRequest = PageRequest.of(page, 6);
PageRequest pageRequest = PageRequest.of(page, 4);
postRepository.findAll().stream()
.map(Post::calculateAverageRatingExcludingLast30DaysReviews)
.collect(Collectors.toList());
return postRepository.findRankedPost(pageRequest);
}


public Page<Post> getCategoryRanking(Integer page, Category category) {
PageRequest pageRequest = PageRequest.of(page, 4);
postRepository.findAll().stream()
.map(Post::calculateAverageRatingExcludingLast30DaysReviews)
.collect(Collectors.toList());
return postRepository.findCategoryRankedPost(pageRequest, category);
}
}