Skip to content
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/kw/zeropick/member/domain/QMember.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ public class QMember extends EntityPathBase<Member> {

public final NumberPath<Long> id = createNumber("id", Long.class);

public final EnumPath<MemberInterest> interest = createEnum("interest", MemberInterest.class);

public final EnumPath<MarketingAgree> marketingAgree = createEnum("marketingAgree", MarketingAgree.class);

public final StringPath name = createString("name");
Expand Down
30 changes: 6 additions & 24 deletions src/main/java/kw/zeropick/home/controller/HomeController.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,8 @@
import kw.zeropick.home.service.HomeService;
import kw.zeropick.payload.ApiResponse;
import kw.zeropick.product.domain.Category;
import kw.zeropick.product.dto.ProductDto;
import kw.zeropick.product.service.ProductService;
import lombok.Builder;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

Expand All @@ -28,27 +25,12 @@ public class HomeController {

private final HomeService homeService;

// @Operation(summary = "홈 화면 조회", description = "홈 화면을 조회합니다.")
// @GetMapping
// public ResponseEntity<?> home(@RequestHeader(value = "Authorization", required = false) String token) {
//
// if (token != null) {
// Long memberId = LoginUser.get().getId(); // 회원일 경우 ID 가져오기
// return ResponseEntity.ok(
// HomeResponse.builder()
// .topPopularityProducts(homeService.getTopPopularityProducts(4))
//// .recommendedProducts(homeService.getRecommendedProducts(memberId))
// .build()
// );
// } else{
// // 비회원일 경우
// return ResponseEntity.ok(
// HomeResponse.builder()
// .topPopularityProducts(homeService.getTopPopularityProducts(4))
// .build()
// );
// }
// }
@Operation(summary = "홈 화면 조회", description = "홈 화면을 조회합니다.")
@GetMapping
public ResponseEntity<HomeResponse> home(@RequestHeader(value = "Authorization", required = false) String token) {
HomeResponse homeResponse = homeService.getHomeResponse(token);
return ResponseEntity.ok(homeResponse);
}


@Operation(summary = "홈 카테고리 베스트 조회", description = "카테고리 베스트를 조회합니다.")
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/kw/zeropick/home/service/HomeService.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package kw.zeropick.home.service;

import java.util.List;

import kw.zeropick.home.dto.response.HomeResponse;
import kw.zeropick.home.dto.response.ProductBestResponse;
import kw.zeropick.product.domain.Category;
import kw.zeropick.product.domain.Product;

public interface HomeService {
List<ProductBestResponse> categoryBest(Long memberId, Category category);
List<ProductBestResponse> getTopPopularityProducts(int limit, String token);
ProductBestResponse toProductBestResponse (Product product);
HomeResponse getHomeResponse(String token);
}
152 changes: 97 additions & 55 deletions src/main/java/kw/zeropick/home/service/HomeServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@

import java.util.List;
import kw.zeropick.common.LoginUser;
import kw.zeropick.home.dto.response.HomeResponse;
import kw.zeropick.home.dto.response.ProductBestResponse;
import kw.zeropick.member.domain.MemberInterest;
import kw.zeropick.member.service.MemberService;
import kw.zeropick.product.domain.Category;
import kw.zeropick.product.domain.Product;
import kw.zeropick.product.domain.ProductSort;
Expand All @@ -26,6 +29,7 @@
public class HomeServiceImpl implements HomeService {
private final ProductService productService;
private final ReviewService reviewService;
private final MemberService memberService;

@Override
public List<ProductBestResponse> categoryBest(Long memberId, Category category) {
Expand Down Expand Up @@ -59,69 +63,107 @@ public List<ProductBestResponse> categoryBest(Long memberId, Category category)

return bestResponses;
}

//
// @Override
// @Transactional
// public ProductBestResponse toProductBestResponse (Product product){
// Long memberId = null;
// try {
// memberId = LoginUser.get().getId(); // 로그인 사용자 정보 가져오기
// } catch (Exception e) {
// // 비회원인 경우 memberId는 null로 설정
// }
//
// ProductBestResponse.ProductBestResponseBuilder builder = ProductBestResponse.builder()
// .id(product.getId())
// .productName(product.getProductName())
// .category(product.getCategory())
// .zeroSugar(product.getZeroSugar())
// .zeroKcal(product.getZeroKcal())
// .price(product.getPrice())
// .starRate(product.getStarRate())
// .imageUrl(product.getImageUrl())
// .reviewCount(product.getReviewCount());
//
// if (memberId != null) { // 회원일 경우
// builder.bookmarked(productService.isBookmarkedByUser(product.getId(), memberId))
// .compared(productService.isComparedByUser(product.getId(), memberId));
// } else { // 비회원일 경우
// builder.bookmarked(null)
// .compared(null);
// }
//
// return builder.build();
// }

@Override
@Transactional
public ProductBestResponse toProductBestResponse (Product product){
Long memberId = null;
try {
memberId = LoginUser.get().getId(); // 로그인 사용자 정보 가져오기
} catch (Exception e) {
// 비회원인 경우 memberId는 null로 설정
}
public HomeResponse getHomeResponse(String token) {
HomeResponse.HomeResponseBuilder responseBuilder = HomeResponse.builder();

// 공통 인기 상품 검색 요청 생성
ProductSearchRequest popularRequest = ProductSearchRequest.builder()
.sort(ProductSort.POPULARITY)
.build();

// 인기 상품 검색 (4개)
List<ProductBestResponse> topPopularityProducts = productService.productSearch(1L, 0, 4, popularRequest)
.getContent()
.stream()
.map(this::toProductBestResponse)
.collect(Collectors.toList());

responseBuilder.topPopularityProducts(topPopularityProducts);

// 회원일 경우 추가적으로 추천 상품을 검색
if (token != null) {
MemberInterest memberInterest = memberService.getMemberInterest(1L);

ProductSearchRequest recommendedRequest = createRecommendedRequest(memberInterest);

List<ProductBestResponse> recommendedProducts = productService.productSearch(1L, 0, 4, recommendedRequest)
.getContent()
.stream()
.map(this::toProductBestResponse)
.collect(Collectors.toList());

ProductBestResponse.ProductBestResponseBuilder builder = ProductBestResponse.builder()
.id(product.getId())
.productName(product.getProductName())
.category(product.getCategory())
.zeroSugar(product.getZeroSugar())
.zeroKcal(product.getZeroKcal())
.price(product.getPrice())
.starRate(product.getStarRate())
.imageUrl(product.getImageUrl())
.reviewCount(product.getReviewCount());

if (memberId != null) { // 회원일 경우
builder.bookmarked(productService.isBookmarkedByUser(product.getId(), memberId))
.compared(productService.isComparedByUser(product.getId(), memberId));
} else { // 비회원일 경우
builder.bookmarked(null)
.compared(null);
responseBuilder.recommendedProducts(recommendedProducts);
}

return builder.build();
return responseBuilder.build();
}

@Override
@Transactional
public List<ProductBestResponse> getTopPopularityProducts ( int limit, String token){
// 인기 상품 검색 요청 생성
ProductSearchRequest productSearchRequest = ProductSearchRequest.builder()
.zeroKcal(Boolean.TRUE)

.sort(ProductSort.POPULARITY)
private ProductBestResponse toProductBestResponse(ProductDto productDto) {
return ProductBestResponse.builder()
.id(productDto.getId())
.productName(productDto.getProductName())
.category(productDto.getCategory())
.zeroSugar(productDto.getZeroSugar())
.zeroKcal(productDto.getZeroKcal())
.price(productDto.getPrice())
.starRate(productDto.getStarRate())
.imageUrl(productDto.getImageUrl())
.reviewCount(productDto.getReviewCount())
.bookmarked(productDto.getBookmarked())
.compared(productDto.getCompared())
.build();
}

private ProductSearchRequest createRecommendedRequest(MemberInterest memberInterest) {
ProductSearchRequest.ProductSearchRequestBuilder requestBuilder = ProductSearchRequest.builder()
.sort(ProductSort.POPULARITY);

// 상품 검색 서비스 호출 (limit 개수만 가져옴)
Page<ProductDto> productDtos = productService.productSearch(1L, 0, limit, productSearchRequest);

// ProductDto 리스트를 ProductBestResponse로 매핑
return productDtos.getContent().stream()
.map(productDto -> ProductBestResponse.builder()
.id(productDto.getId())
.productName(productDto.getProductName())
.category(productDto.getCategory())
.zeroSugar(productDto.getZeroSugar())
.zeroKcal(productDto.getZeroKcal())
.price(productDto.getPrice())
.starRate(productDto.getStarRate())
.imageUrl(productDto.getImageUrl())
.reviewCount(productDto.getReviewCount())
.reviewResponse(null) // 리뷰 관련 로직 필요 시 업데이트
.bookmarked(productDto.getBookmarked())
.compared(productDto.getCompared())
.build()
)
.toList();
if (memberInterest == MemberInterest.BOTH) {
requestBuilder.zeroSugar(true).zeroKcal(true);
} else if (memberInterest == MemberInterest.ZEROKCAL) {
requestBuilder.zeroSugar(false).zeroKcal(true);
} else if (memberInterest == MemberInterest.ZEROSUGAR) {
requestBuilder.zeroSugar(true).zeroKcal(false);
} else if (memberInterest == MemberInterest.NONE) {
requestBuilder.zeroSugar(false).zeroKcal(false);
}

return requestBuilder.build();
}

}
5 changes: 2 additions & 3 deletions src/main/java/kw/zeropick/member/domain/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,8 @@ public class Member {
@NotNull
private String password;


// @Convert(converter = StringListToStringConverter.class)
// private List<String> field;
@Enumerated(EnumType.STRING)
private MemberInterest interest;

@NotNull
@Enumerated(EnumType.STRING)
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/kw/zeropick/member/domain/MemberInterest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package kw.zeropick.member.domain;

public enum MemberInterest {
BOTH,
ZEROKCAL,
ZEROSUGAR,
NONE
}
8 changes: 8 additions & 0 deletions src/main/java/kw/zeropick/member/service/MemberService.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package kw.zeropick.member.service;

import jakarta.persistence.EntityNotFoundException;
import kw.zeropick.common.domain.exception.ResourceNotFoundException;
import kw.zeropick.member.controller.response.MemberInfoResponse;
import kw.zeropick.member.domain.Member;
import kw.zeropick.member.domain.MemberInterest;
import kw.zeropick.member.domain.exception.ConfirmPasswordMismatchException;
import kw.zeropick.member.domain.exception.FieldUpdateException;
import kw.zeropick.member.domain.exception.InvalidMemberDataException;
Expand Down Expand Up @@ -91,5 +93,11 @@ public Member updateMemberInfo(Long memberId, MemberInfoChangeDto memberInfoChan
return member;
}

public MemberInterest getMemberInterest(Long memberId) {
Member member = memberJpaRepository.findById(memberId)
.orElseThrow(() -> new EntityNotFoundException("해당 회원을 찾을 수 없습니다. ID: " + memberId));

return member.getInterest();
}

}
Loading