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
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package com.DecodEat.domain.products.controller;

import com.DecodEat.domain.products.dto.response.ProductDetailDto;
import com.DecodEat.domain.products.dto.response.*;
import com.DecodEat.domain.products.dto.request.ProductRegisterRequestDto;
import com.DecodEat.domain.products.dto.response.ProductRegisterResponseDto;
import com.DecodEat.domain.products.dto.response.ProductResponseDTO;
import com.DecodEat.domain.products.dto.response.ProductSearchResponseDto;
import com.DecodEat.domain.products.entity.RawMaterial.RawMaterialCategory;
import com.DecodEat.domain.products.service.ProductService;
import com.DecodEat.domain.users.entity.User;
Expand Down Expand Up @@ -44,7 +41,8 @@ public ApiResponse<ProductDetailDto> getProduct(@PathVariable Long id) {
@Operation(
summary = "제품 등록",
description = "상품 이미지, 제품명, 회사명으로 상품을 등록합니다")
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) //이 엔드포인트가 multipart/form-data 타입의 요청 본문을 소비(consume)한다는 것을 명확하게 선언
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
//이 엔드포인트가 multipart/form-data 타입의 요청 본문을 소비(consume)한다는 것을 명확하게 선언
public ApiResponse<ProductRegisterResponseDto> registerProduct(
@CurrentUser User user,
@RequestParam("name") String name,
Expand Down Expand Up @@ -90,8 +88,20 @@ public ApiResponse<PageResponseDto<ProductSearchResponseDto.ProductPrevDto>> sea
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size) {

Pageable pageable = PageRequest.of(page-1, size, Sort.by("productName").ascending()); // 0-based
Pageable pageable = PageRequest.of(page - 1, size, Sort.by("productName").ascending()); // 0-based
return ApiResponse.onSuccess(productService.searchProducts(productName, categories, pageable));
}

@GetMapping("/register-history")
@Operation(summary = "나의 분석 요청 기록", description = "내가 등록한 상품의 분석 결과 목록입니다.")
public ApiResponse<PageResponseDto<ProductRegisterHistoryDto>> getRegisterHistory(@CurrentUser User user,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size) {

Pageable pageable = PageRequest.of(page - 1, size, Sort.by("createdAt").descending()); // 0-based

return ApiResponse.onSuccess(productService.getRegisterHistory(user, pageable));
}


}
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
package com.DecodEat.domain.products.converter;

import com.DecodEat.domain.products.dto.response.ProductDetailDto;
import com.DecodEat.domain.products.dto.response.ProductRegisterResponseDto;
import com.DecodEat.domain.products.dto.response.ProductResponseDTO;
import com.DecodEat.domain.products.dto.response.ProductSearchResponseDto;
import com.DecodEat.domain.products.dto.request.ProductRegisterRequestDto;
import com.DecodEat.domain.products.dto.response.*;
import com.DecodEat.domain.products.entity.Product;
import com.DecodEat.domain.products.entity.ProductNutrition;
import com.DecodEat.domain.products.entity.RawMaterial.RawMaterialCategory;
Expand Down Expand Up @@ -94,6 +92,16 @@ public static ProductSearchResponseDto.ProductPrevDto toProductPrevDto(Product p
.build();
}

public static ProductRegisterHistoryDto toProductRegisterHistoryDto(Product product){
return ProductRegisterHistoryDto.builder()
.productId(product.getProductId())
.registerDate(product.getCreatedAt())
.productImage(product.getProductImage())
.decodeStatus(product.getDecodeStatus())
.build();
}


// Slice<Product> → ProductListResultDTO 변환
public static ProductResponseDTO.ProductListResultDTO toProductListResultDTO(Slice<Product> slice) {
List<ProductResponseDTO.ProductListItemDTO> productList = slice.getContent().stream()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.DecodEat.domain.products.dto.response;

import com.DecodEat.domain.products.entity.DecodeStatus;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
@Builder
public class ProductRegisterHistoryDto {

@Schema(description = "상품 ID", example = "1")
private Long productId;

@Schema(description = "상품 등록일", example = "2025-09-05")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime registerDate;

@Schema(description = "상품 이미지", example = "https://example.com/image.jpg")
private String productImage;

@Schema(description = "분석 상태", example = "COMPLETED")
private DecodeStatus decodeStatus;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import com.DecodEat.domain.products.entity.DecodeStatus;
import com.DecodEat.domain.products.entity.Product;
import com.DecodEat.domain.users.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;
Expand All @@ -22,4 +24,6 @@ Slice<Product> findCompletedProductsByCursor(@Param("cursorId") Long cursorId,
Pageable pageable);

void deleteByDecodeStatusIn(List<DecodeStatus> statuses);

Page<Product> findByUserId(Long userId, Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@

import com.DecodEat.domain.products.converter.ProductConverter;
import com.DecodEat.domain.products.dto.request.ProductRegisterRequestDto;
import com.DecodEat.domain.products.dto.response.ProductDetailDto;
import com.DecodEat.domain.products.dto.response.ProductRegisterResponseDto;
import com.DecodEat.domain.products.dto.response.ProductResponseDTO;
import com.DecodEat.domain.products.dto.response.ProductSearchResponseDto;
import com.DecodEat.domain.products.dto.response.*;
import com.DecodEat.domain.products.entity.DecodeStatus;
import com.DecodEat.domain.products.entity.Product;
import com.DecodEat.domain.products.entity.ProductInfoImage;
Expand Down Expand Up @@ -145,4 +142,14 @@ public PageResponseDto<ProductSearchResponseDto.ProductPrevDto> searchProducts(S

return new PageResponseDto<>(result);
}

public PageResponseDto<ProductRegisterHistoryDto> getRegisterHistory(User user, Pageable pageable){

Long userId = user.getId();

Page<Product> pagedProducts = productRepository.findByUserId(userId, pageable);
Page<ProductRegisterHistoryDto> result = pagedProducts.map(ProductConverter::toProductRegisterHistoryDto);

return new PageResponseDto<>(result);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,19 @@ public class CurrentUserArgumentResolver implements HandlerMethodArgumentResolve
@Override
public boolean supportsParameter(org.springframework.core.MethodParameter parameter) {
return parameter.getParameterAnnotation(CurrentUser.class) != null
&& parameter.getParameterType().equals(com.DecodEat.domain.users.entity.User.class);
&& parameter.getParameterType().equals(com.DecodEat.domain.users.entity.User.class);
}

@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
try {
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

if (principal instanceof org.springframework.security.core.userdetails.User) {
org.springframework.security.core.userdetails.User springUser = (org.springframework.security.core.userdetails.User) principal;
Long userId = Long.valueOf(springUser.getUsername());
return userService.findById(userId); // userId로 User 엔티티를 찾아 반환
}
} catch (Exception e) {
// 예외 처리, 인증되지 않은 사용자의 경우 null 또는 예외를 던질 수 있습니다.
throw new GeneralException(ErrorStatus._UNAUTHORIZED);
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

if (principal instanceof org.springframework.security.core.userdetails.User springUser) {
Long userId = Long.valueOf(springUser.getUsername());
return userService.findById(userId); // userId로 User 엔티티를 찾아 반환
}

return null;
throw new GeneralException(ErrorStatus._UNAUTHORIZED);
}
}
Loading