Skip to content

Commit

Permalink
Merge pull request #31 from Central-MakeUs/14-필터를-조회한다
Browse files Browse the repository at this point in the history
Fix(#30): 필터 조회 수정
  • Loading branch information
tmddus2 committed Aug 9, 2024
2 parents ef3d179 + be55361 commit 8fc2167
Show file tree
Hide file tree
Showing 11 changed files with 62 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,15 @@ public record FilterDto(
boolean liked

) {
public static FilterDto of(Filter filter, Membership membership, boolean liked) {
public static FilterDto of(Filter filter, Membership membership, boolean liked, int numOfLikes) {
return FilterDto.builder()
.id(filter.getId())
.membership(filter.getMembership())
.name(filter.getName())
.thumbnail(filter.getThumbnail())
.photographerId(filter.getPhotographer().getId())
.photographerName(filter.getPhotographer().getUsername())
.likes(filter.getLikes())
.likes(numOfLikes)
.canAccess(checkAccess(membership, filter.getMembership()))
.liked(liked)
.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,13 @@ public class Filter {
@JoinColumn(name = "photographer_id", nullable = false)
private Photographer photographer;

private int likes;

private int price;

@Temporal(TemporalType.TIMESTAMP)
@CreatedDate
@Column(updatable = false)
private Date createdAt;

int pureDegree;

@Convert(converter = StringListConverter.class)
private List<String> pictures;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,18 @@
import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import com.example.purithm.domain.filter.entity.Filter;
import com.example.purithm.domain.filter.entity.FilterLike;

public interface FilterLikeRepository extends JpaRepository<FilterLike, Long> {
Optional<FilterLike> findByFilterIdAndUserId(Long filterId, Long userId);
void deleteByFilterIdAndUserId(Long filterId, Long userId);

@Query("select count(fl.user) as cnt\n"
+ "from FilterLike fl\n"
+ "where fl.filter = :filter")
int getLikes(@Param("filter") Filter filter);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,30 @@
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.example.purithm.domain.filter.entity.Filter;
import com.example.purithm.domain.filter.entity.OS;

@Repository
public interface FilterRepository extends JpaRepository<Filter, Long> {
Page<Filter> findAllByOs(OS os, Pageable pageable);
Page<Object[]> findAllByOs(OS os, Pageable pageable);
@Query("SELECT f, COUNT(fl.id) AS like_count " +
"FROM Filter f " +
"LEFT JOIN FilterLike fl " +
"ON f.id=fl.filter.id " +
"WHERE f.os=:os " +
"GROUP BY f.id " +
"ORDER BY like_count DESC")
Page<Object[]> findAllWithLikeSorting(OS os, Pageable pageable);

@Query("SELECT f, AVG(r.pureDegree) AS avg " +
"FROM Filter f " +
"LEFT JOIN Review r ON f.id = r.filter.id " +
"WHERE f.os=:os " +
"GROUP BY f.id " +
"ORDER BY avg DESC")
Page<Object[]> findAllWithReviewSorting(OS os, Pageable pageable);

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import com.example.purithm.domain.filter.entity.Filter;
import com.example.purithm.domain.filter.entity.OS;
import com.example.purithm.domain.filter.entity.Tag;

@Repository
public interface TagRepository extends JpaRepository<Tag, Long> {
@Query("SELECT t.filter FROM Tag t WHERE t.tag = :tag AND t.filter.os = :os")
Page<Filter> findFilterByTagAndOs(@Param("tag") String tag, @Param("os") OS os, Pageable pageable);
Page<Object[]> findFilterByTagAndOs(@Param("tag") String tag, @Param("os") OS os, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
Expand Down Expand Up @@ -51,35 +52,41 @@ public class FilterService {


public FilterListDto getFilters(Long id, int page, int size, OS os, String tag, String sortedBy) {
PageRequest pageRequest = PageRequest.of(page, size, Sort.by("createdAt").descending()); // 정렬 없을 때는 최신 순
switch (sortedBy) {
case "earliest" -> { // 오래된 순 정렬
pageRequest = PageRequest.of(page, size, Sort.by("createdAt").ascending());
} case "popular" -> { // 퓨어지수 높은 순
pageRequest = PageRequest.of(page, size, Sort.by("likes").descending());
}
}

User user = userRepository.findById(id)
.orElseThrow(() -> CustomException.of(Error.NOT_FOUND_ERROR));

PageRequest pageRequest = PageRequest.of(page, size);
Page<Object[]> filters;
if (tag == null) {
Page<Filter> filters = filterRepository.findAllByOs(os, pageRequest);
if (sortedBy.equals("popular")) {
filters = filterRepository.findAllWithLikeSorting(os, pageRequest);
} else if (sortedBy.equals("pure")) {
filters = filterRepository.findAllWithReviewSorting(os, pageRequest);

} else {
pageRequest = PageRequest.of(page, size, Sort.by("createdAt").descending()); // 정렬 없을 때는 최신 순
filters = filterRepository.findAllByOs(os, pageRequest);
}

return FilterListDto.builder()
.isLast(filters.isLast())
.filters(
filters.getContent().stream().map(filter ->
FilterDto.of(filter, user.getMembership(), isLike(filter.getId(), id))).toList())
.build();
.filters(filters.getContent().stream().map(filter ->
FilterDto.of((Filter) filter[0],
user.getMembership(),
isLike(((Filter) filter[0]).getId(), id),
filterLikeRepository.getLikes((Filter) filter[0]))).toList()).build();
}

Page<Filter> filters = tagRepository.findFilterByTagAndOs(tag, os, pageRequest);
filters = tagRepository.findFilterByTagAndOs(tag, os, pageRequest);
return FilterListDto.builder()
.isLast(filters.isLast())
.filters(
filters.getContent().stream().map(filter ->
FilterDto.of(filter, user.getMembership(), isLike(filter.getId(), id))).toList())
.build();
FilterDto.of(
(Filter) filter[0],
user.getMembership(),
isLike(((Filter) filter[0]).getId(), id),
filterLikeRepository.getLikes((Filter) filter[0]))).toList()).build();
}

private boolean isLike(Long filterId, Long userId) {
Expand All @@ -102,8 +109,8 @@ public FilterDetailDto getFilterDetail(Long id, Long filterId) {

return FilterDetailDto.builder()
.name(filter.getName())
.likes(filter.getLikes())
.pureDegree(filter.getPureDegree())
.likes(filterLikeRepository.getLikes(filter))
.pureDegree(Optional.ofNullable(reviewRepository.getAverage(filterId)).orElse(0))
.pictures(filters)
.liked(isLike(filterId, id))
.build();
Expand Down Expand Up @@ -133,16 +140,17 @@ public void likeFilter(Long userId, Long filterId) {
filterLikeRepository.save(like);
}

@Transactional
public void dislikeFilter(Long userId, Long filterId) {
filterLikeRepository.deleteByFilterIdAndUserId(filterId, userId);
}

@Transactional
public FilterReviewDto getReviews(Long filterId) {
int avg = reviewRepository.getAverage(filterId);
Integer avg = reviewRepository.getAverage(filterId);
List<ReviewDto> reviews = reviewRepository.findAllByFilterId(filterId)
.stream().map(ReviewDto::of).toList();

return FilterReviewDto.of(avg, reviews);
return FilterReviewDto.of(Optional.ofNullable(avg).orElse(0), reviews);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ public interface ReviewRepository extends JpaRepository<Review, Long> {
@Query("select avg(r.pureDegree) as avg\n"
+ "from Review r\n"
+ "where r.filter.id = :id")
int getAverage(@Param("id") Long filterId);
Integer getAverage(@Param("id") Long filterId);
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.example.purithm.domain.user.service;

import com.example.purithm.domain.filter.entity.Membership;
import com.example.purithm.global.auth.dto.response.SocialUserInfoDto;
import com.example.purithm.domain.user.entity.User;
import com.example.purithm.domain.user.repository.UserRepository;
Expand Down Expand Up @@ -29,6 +30,7 @@ public Long signUp(SocialUserInfoDto socialUserInfoDto) {
.providerId(socialUserInfoDto.getProviderId())
.username(socialUserInfoDto.getUsername())
.terms(false)
.membership(Membership.BASIC)
.build();

User savedUser = userRepository.save(user);
Expand Down
Empty file.
Empty file.

0 comments on commit 8fc2167

Please sign in to comment.