Skip to content

Commit

Permalink
Merge pull request #78 from IRECIPE/feat/63
Browse files Browse the repository at this point in the history
[FEAT] 이달의 랭킹 및 카테고리별 랭킹 구현
  • Loading branch information
jun23314 authored Feb 8, 2024
2 parents 77f2529 + 0ba74cd commit 5040949
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 2 deletions.
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);
}
}


0 comments on commit 5040949

Please sign in to comment.