Skip to content

Commit

Permalink
Merge pull request #114 from BETTER-iTER/feature/95
Browse files Browse the repository at this point in the history
[Feature/95] mypage review 관련 api 제작
  • Loading branch information
luke0408 authored Dec 18, 2023
2 parents 53e6e9e + af27ada commit 7e00ed0
Show file tree
Hide file tree
Showing 10 changed files with 236 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.example.betteriter.fo_domain.mypage.controller;


import com.example.betteriter.fo_domain.mypage.converter.MypageResponseConverter;
import com.example.betteriter.fo_domain.mypage.dto.MypageResponse;
import com.example.betteriter.fo_domain.mypage.service.MypageService;
import com.example.betteriter.fo_domain.review.domain.Review;
import com.example.betteriter.global.common.response.ResponseDto;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.constraints.Email;
import java.util.ArrayList;
import java.util.List;


@Tag(name = "MypageControllers", description = "Mypage API")
@Slf4j
@RequestMapping("/mypage")
@RequiredArgsConstructor
@RestController
public class MypageController {

private final MypageService mypageService;

@GetMapping("/review?email={email}")
public ResponseDto<List<MypageResponse.MyReviewDto>> getReview(
@RequestParam(value = "email", required = false) @Email String email
) {
List<Review> reviewList;
if (mypageService.checkUserSelf(email)) reviewList = mypageService.getMyReviewList();
else reviewList = mypageService.getTargetReviewList(email);

return ResponseDto.onSuccess(MypageResponseConverter.toMyReviewDtoList(reviewList));
}

@GetMapping("/review/scrap?user_id={user_id}")
public ResponseDto<List<MypageResponse.MyReviewDto>> getScrapReview(
@RequestParam(value = "email", required = false) @Email String email
) {
List<Review> reviewList = mypageService.getScrapReviewList(email);
return ResponseDto.onSuccess(MypageResponseConverter.toMyReviewDtoList(reviewList));
}

@GetMapping("/review/like?email={email}")
public ResponseDto<List<MypageResponse.MyReviewDto>> getLikeReview(
@RequestParam(value = "email", required = false) @Email String email
) {
List<Review> reviewList = mypageService.getLikeReviewList(email);
return ResponseDto.onSuccess(MypageResponseConverter.toMyReviewDtoList(reviewList));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.betteriter.fo_domain.mypage.converter;

import com.example.betteriter.fo_domain.mypage.dto.MypageResponse;
import com.example.betteriter.fo_domain.review.domain.Review;

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

public class MypageResponseConverter {
public static List<MypageResponse.MyReviewDto> toMyReviewDtoList(List<Review> reviewList) {
List<MypageResponse.MyReviewDto> myReviewList = new ArrayList<>();

reviewList.forEach(r -> {
MypageResponse.MyReviewDto myReviewDto = MypageResponse.MyReviewDto.builder()
.review_id(r.getId())
.title(r.getProductName())
.profile_image((r.getReviewImages().size() > 0) ?
r.getReviewImages().get(0).getImgUrl():
"none")
.like_count(r.getReviewLiked().stream().count())
.scrap_count(r.getReviewScraped().stream().count())
.build();
myReviewList.add(myReviewDto);
});

return myReviewList;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.betteriter.fo_domain.mypage.dto;

public class MypageRequest {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.betteriter.fo_domain.mypage.dto;

import lombok.Builder;
import lombok.Getter;

public class MypageResponse {

@Getter
@Builder
public static class MyReviewDto{
private Long review_id;
private String title;
private String profile_image;
private Long like_count;
private Long scrap_count;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.example.betteriter.fo_domain.mypage.exception;

import com.example.betteriter.global.common.code.status.ErrorStatus;
import com.example.betteriter.global.common.exception.GeneralException;

public class MypageHandler extends GeneralException {

public MypageHandler(ErrorStatus errorStatus) {
super(errorStatus);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.example.betteriter.fo_domain.mypage.service;

import com.example.betteriter.fo_domain.review.domain.Review;
import com.example.betteriter.fo_domain.review.service.ReviewService;
import com.example.betteriter.fo_domain.user.domain.Users;
import com.example.betteriter.fo_domain.user.service.UserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;

@Slf4j
@RequiredArgsConstructor
@Service
public class MypageService {

private final UserService userService;
private final ReviewService reviewService;

public List<Review> getMyReviewList() {
Users user = userService.getCurrentUser();
return reviewService.getReviewList(user.getId());
}

public List<Review> getScrapReviewList(String email) {
Users user = userService.getUserByEmail(email);
return reviewService.getScrapReviewList(user);
}

public List<Review> getLikeReviewList(String email) {
Users user = userService.getUserByEmail(email);
return reviewService.getLikeReviewList(user);
}

public List<Review> getTargetReviewList(String email) {
Users user = userService.getUserByEmail(email);
return reviewService.getTargetReviewList(user.getId());
}

public boolean checkUserSelf(String email) {
Users user = userService.getCurrentUser();
return user.getEmail().equals(email);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.example.betteriter.fo_domain.user.domain.Users;
import com.example.betteriter.global.common.entity.BaseEntity;
import com.example.betteriter.global.constant.Category;
import com.example.betteriter.global.constant.Status;
import lombok.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
Expand Down Expand Up @@ -46,14 +47,23 @@ public class Review extends BaseEntity {
private double starPoint;
@Column(name = "short_review", nullable = false)
private String shortReview;

@Column(name = "click_cnt")
private Long clickCount; // 클릭 수

@Lob // 최대 500 자
@Column(name = "good_point", nullable = false)
private String goodPoint;
@Lob // 최대 500 자
@Column(name = "bad_point", nullable = false)
private String badPoint;


@Column(name = "status", nullable = false)
@Enumerated(EnumType.STRING)
private Status status; // ACTIVE, DELETED


// --------------- Review 관련 엔티티 ---------------- //
@OneToMany(mappedBy = "review", cascade = CascadeType.ALL, orphanRemoval = true)
private List<ReviewImage> reviewImages = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ public interface ReviewRepository extends JpaRepository<Review, Long> {
"ORDER BY (COALESCE(COUNT(rs), 0) + COALESCE(COUNT(rl), 0)) DESC")
List<Review> findTop7ReviewHavingMostScrapedAndLiked(Pageable pageable);


@Query("select r from REVIEW r " +
"LEFT JOIN r.reviewLiked rl " +
"LEFT JOIN r.reviewScraped rs " +
Expand All @@ -36,4 +35,40 @@ public interface ReviewRepository extends JpaRepository<Review, Long> {
Slice<Review> findReviewByCategory(Category category, Pageable pageable);

Slice<Review> findFirst20ByProductNameOrderByClickCountDescCreatedAtDesc(String productName, Pageable pageable);

@Query("SELECT r FROM REVIEW r " +
"LEFT JOIN r.reviewLiked rl " +
"LEFT JOIN r.reviewScraped rs " +
"WHERE rs.users = :user AND " +
" r.status = 'ACTIVE'" +
"GROUP BY r.id " +
"ORDER BY r.createdAt DESC")
List<Review> findAllByTargetId(Long id);

@Query("SELECT r FROM REVIEW r " +
"LEFT JOIN r.reviewLiked rl " +
"LEFT JOIN r.reviewScraped rs " +
"WHERE rs.users = :user AND " +
" r.status != 'DELETED'" +
"GROUP BY r.id " +
"ORDER BY r.createdAt DESC")
List<Review> findAllByUser(Long id);

@Query("SELECT r FROM REVIEW r " +
"LEFT JOIN r.reviewLiked rl " +
"LEFT JOIN r.reviewScraped rs " +
"WHERE rs.users = :user AND " +
" r.status = 'ACTIVE'" +
"GROUP BY r.id " +
"ORDER BY r.createdAt DESC")
List<Review> findAllByReviewScrapedUser(Users user);

@Query("SELECT r FROM REVIEW r " +
"LEFT JOIN r.reviewLiked rl " +
"LEFT JOIN r.reviewScraped rs " +
"WHERE rl.users = :user AND " +
" r.status = 'ACTIVE'" +
"GROUP BY r.id " +
"ORDER BY r.createdAt DESC")
List<Review> findAllByReviewLikedUser(Users user);
}
Original file line number Diff line number Diff line change
Expand Up @@ -153,4 +153,20 @@ public Review findReviewById(Long reviewId) {
return this.reviewRepository.findById(reviewId)
.orElseThrow(() -> new ReviewHandler(_REVIEW_NOT_FOUND));
}

public List<Review> getReviewList(Long id) {
return this.reviewRepository.findAllByUser(id);
}

public List<Review> getScrapReviewList(Users user) {
return this.reviewRepository.findAllByReviewScrapedUser(user);
}

public List<Review> getLikeReviewList(Users user) {
return this.reviewRepository.findAllByReviewLikedUser(user);
}

public List<Review> getTargetReviewList(Long id) {
return this.reviewRepository.findAllByTargetId(id);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,15 @@ public Users getCurrentUser() {
public UsersDetail getCurrentUsersDetail() {
return this.getCurrentUser().getUsersDetail();
}

/* 회원 정보 가져오기 */
public Users getUserById(Long userId) {
return this.usersRepository.findById(userId)
.orElseThrow(() -> new UserHandler(ErrorStatus._USER_NOT_FOUND));
}

public Users getUserByEmail(String email) {
return this.usersRepository.findByEmail(email)
.orElseThrow(() -> new UserHandler(ErrorStatus._USER_NOT_FOUND));
}
}

0 comments on commit 7e00ed0

Please sign in to comment.