diff --git a/src/main/java/com/hyundai/domain/product/controller/ProductController.java b/src/main/java/com/hyundai/domain/product/controller/ProductController.java index 9ba6618..ac321b9 100644 --- a/src/main/java/com/hyundai/domain/product/controller/ProductController.java +++ b/src/main/java/com/hyundai/domain/product/controller/ProductController.java @@ -12,7 +12,9 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; @@ -52,6 +54,12 @@ public ResponseEntity getProducts(@RequestBody WrapperSearchDTO wrapperSearch } } + // 상품 이미지 검색 + @PostMapping("/image-search") + public ResponseEntity getImageSearchProducts(MultipartFile image) throws IOException { + return ResponseMessage.SuccessResponse("상품 이미지 검색 성공", productService.getImageSearchProducts(image)); + } + // 상품 상세 조회 @GetMapping("/{productId}") public ResponseEntity getProductDetail(@PathVariable Long productId) { diff --git a/src/main/java/com/hyundai/domain/product/dto/request/WrapperSearchDTO.java b/src/main/java/com/hyundai/domain/product/dto/request/WrapperSearchDTO.java index 2f34ff5..80942e1 100644 --- a/src/main/java/com/hyundai/domain/product/dto/request/WrapperSearchDTO.java +++ b/src/main/java/com/hyundai/domain/product/dto/request/WrapperSearchDTO.java @@ -2,8 +2,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; -import org.springframework.web.bind.annotation.RequestBody; /** * fileName : WrapperSearchDTO diff --git a/src/main/java/com/hyundai/domain/product/service/ProductService.java b/src/main/java/com/hyundai/domain/product/service/ProductService.java index 66a4f7e..8fc9bc1 100644 --- a/src/main/java/com/hyundai/domain/product/service/ProductService.java +++ b/src/main/java/com/hyundai/domain/product/service/ProductService.java @@ -3,7 +3,10 @@ import com.hyundai.domain.product.dto.request.ProductCriteria; import com.hyundai.domain.product.dto.request.SearchRequestDTO; import com.hyundai.domain.product.dto.response.ProductResponseDTO; +import com.hyundai.domain.product.dto.response.RecommendProducts; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; public interface ProductService { @@ -15,4 +18,6 @@ public interface ProductService { List getWineProducts(ProductCriteria productCriteria, String memberId); List getThemeProducts(ProductCriteria productCriteria, String memberId); + + List getImageSearchProducts(MultipartFile image) throws IOException; } diff --git a/src/main/java/com/hyundai/domain/product/service/ProductServiceImpl.java b/src/main/java/com/hyundai/domain/product/service/ProductServiceImpl.java index 95e3cfc..9bb1c55 100644 --- a/src/main/java/com/hyundai/domain/product/service/ProductServiceImpl.java +++ b/src/main/java/com/hyundai/domain/product/service/ProductServiceImpl.java @@ -1,20 +1,32 @@ package com.hyundai.domain.product.service; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; import com.hyundai.domain.login.security.CustomMemberDetails; import com.hyundai.domain.product.dto.request.ProductCriteria; import com.hyundai.domain.product.dto.request.SearchRequestDTO; import com.hyundai.domain.product.dto.response.ProductResponseDTO; +import com.hyundai.domain.product.dto.response.RecommendProducts; import com.hyundai.domain.product.entity.Product; import com.hyundai.domain.product.repository.ProductSearchRepository; import com.hyundai.global.mapper.ProductMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.elasticsearch.core.ElasticsearchTemplate; +import org.springframework.http.*; +import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -108,4 +120,26 @@ public List getThemeProducts(ProductCriteria productCriteria return (List) params.get("cursor"); } + @Override + public List getImageSearchProducts(MultipartFile image) throws IOException { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getMessageConverters().add(0, new StringHttpMessageConverter(StandardCharsets.UTF_8)); + + String fastApiUrl = "http://localhost:8000/ai/image-search"; + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.MULTIPART_FORM_DATA); + + MultiValueMap body = new LinkedMultiValueMap<>(); + body.add("file", Base64.getEncoder().encodeToString(image.getBytes())); + + HttpEntity> entity = new HttpEntity<>(body, headers); + ResponseEntity response = restTemplate.exchange(fastApiUrl, HttpMethod.POST, entity, String.class); + + // ObjectMapper 생성 + ObjectMapper objectMapper = new ObjectMapper(); + List products = objectMapper.readValue(response.getBody(), new TypeReference>(){}); + return products; + } + }