Skip to content

Commit e98bce7

Browse files
authored
Merge pull request #90 from SynergyX-AI-Pattern/feat/#80_image_search_non_kospi100_support
Feat/#80 image search non kospi100 support
2 parents cc31044 + 2d0e08d commit e98bce7

File tree

6 files changed

+61
-39
lines changed

6 files changed

+61
-39
lines changed

src/main/java/com/synergyx/trading/controller/StockController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import com.synergyx.trading.dto.stockDetail.RankedStockDTO;
77
import com.synergyx.trading.dto.stockDetail.StockCandleResponseDTO;
88
import com.synergyx.trading.dto.stockDetail.StockDetailResponseDTO;
9+
import com.synergyx.trading.dto.stockSearch.StockSearchFastApiResponseDTO;
910
import com.synergyx.trading.dto.stockSearch.StockSearchResponseDTO;
1011
import com.synergyx.trading.service.stockService.candle.StockCandleQueryService;
1112
import com.synergyx.trading.service.stockService.detail.StockDetailQueryService;
@@ -72,7 +73,6 @@ public ResponseEntity<?> getStockCandles(
7273
SuccessStatus.SUCCESS_CHART_DATA.getMessage()
7374
));
7475
}
75-
7676
@Operation(summary = "TOP 20 종목 조회", description = "TOP 20 종목을 조회합니다. (거래대금 기준)")
7777
@GetMapping("/top20")
7878
public ResponseEntity<?> getTop20Stocks() {
@@ -95,7 +95,7 @@ public ResponseEntity<?> searchStockByImage(
9595
required = true
9696
)
9797
@RequestParam("image") MultipartFile image) {
98-
StockSearchResponseDTO result = stockSearchQueryService.searchStockByImage(image);
98+
StockSearchFastApiResponseDTO.StockSearchFastApiInfoResponseDTO result = stockSearchQueryService.searchStockByImage(image);
9999
return ResponseEntity.ok(ApiResponse.onSuccess(result));
100100
}
101101
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.synergyx.trading.dto.stockSearch;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import com.synergyx.trading.enums.StockStatus;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
public class StockSearchFastApiResponseDTO {
11+
12+
// FastAPI에서 받은 응답을 감싸는 Wrapper DTO
13+
@Getter
14+
@Builder
15+
@NoArgsConstructor
16+
@AllArgsConstructor
17+
public static class StockSearchFastApiWrapperDTO {
18+
19+
// camelCase로 매핑
20+
@JsonProperty("is_success")
21+
private boolean isSuccess;
22+
23+
private String code;
24+
private String message;
25+
private StockSearchFastApiInfoResponseDTO data;
26+
}
27+
28+
// 반환 응답
29+
@Getter
30+
@Builder
31+
@NoArgsConstructor
32+
@AllArgsConstructor
33+
public static class StockSearchFastApiInfoResponseDTO {
34+
private Long id; // stock id
35+
private String name; // 종목명
36+
private String imageUrl; // 종목 이미지
37+
private StockStatus status; // 종목 상태
38+
}
39+
}

src/main/java/com/synergyx/trading/dto/stockSearch/StockSearchFastApiWrapperDTO.java

Lines changed: 0 additions & 23 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.synergyx.trading.enums;
2+
3+
public enum StockStatus {
4+
LISTED, // KOSPI100 종목
5+
LISTED_OUTSIDE, // db에 없는 상장 기업
6+
UNLISTED, // 비상장 브랜드/기업
7+
UNKNOWN // 판단 불가
8+
}
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package com.synergyx.trading.service.stockService.search;
22

3+
import com.synergyx.trading.dto.stockSearch.StockSearchFastApiResponseDTO;
34
import com.synergyx.trading.dto.stockSearch.StockSearchResponseDTO;
45
import org.springframework.web.multipart.MultipartFile;
56

67
import java.util.List;
78

89
public interface StockSearchQueryService {
910
List<StockSearchResponseDTO> searchStocksByName(String keyword);
11+
1012
// 이미지 기반 검색
11-
StockSearchResponseDTO searchStockByImage(MultipartFile image);
13+
StockSearchFastApiResponseDTO.StockSearchFastApiInfoResponseDTO searchStockByImage(MultipartFile image);
1214
}

src/main/java/com/synergyx/trading/service/stockService/search/StockSearchQueryServiceImpl.java

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.synergyx.trading.service.stockService.search;
22

3-
import com.synergyx.trading.dto.stockSearch.StockSearchFastApiWrapperDTO;
3+
import com.synergyx.trading.dto.stockSearch.StockSearchFastApiResponseDTO;
44
import com.synergyx.trading.apiPayload.code.status.ErrorStatus;
55
import com.synergyx.trading.apiPayload.exception.GeneralException;
66
import com.synergyx.trading.dto.stockSearch.StockSearchResponseDTO;
7-
import com.synergyx.trading.model.Stock;
87
import com.synergyx.trading.repository.StockRepository;
98
import lombok.RequiredArgsConstructor;
109
import org.springframework.http.MediaType;
@@ -46,7 +45,7 @@ public List<StockSearchResponseDTO> searchStocksByName(String keyword) {
4645
* @return StockSearchResponseDTO
4746
*/
4847
@Override
49-
public StockSearchResponseDTO searchStockByImage(MultipartFile image) {
48+
public StockSearchFastApiResponseDTO.StockSearchFastApiInfoResponseDTO searchStockByImage(MultipartFile image) {
5049
// 파일 검증
5150
if (image.isEmpty()) {
5251
throw new GeneralException(ErrorStatus.IMAGE_FILE_MISSING);
@@ -67,26 +66,23 @@ public StockSearchResponseDTO searchStockByImage(MultipartFile image) {
6766
MultipartBodyBuilder builder = new MultipartBodyBuilder();
6867
builder.part("image", image.getResource());
6968

70-
StockSearchFastApiWrapperDTO response = fastApiWebClient.post()
69+
StockSearchFastApiResponseDTO.StockSearchFastApiWrapperDTO response = fastApiWebClient.post()
7170
.uri("/api/v1/stocks/search-by-image")
7271
.contentType(MediaType.MULTIPART_FORM_DATA)
7372
.bodyValue(builder.build())
7473
.retrieve()
75-
.bodyToMono(StockSearchFastApiWrapperDTO.class)
74+
.bodyToMono(StockSearchFastApiResponseDTO.StockSearchFastApiWrapperDTO.class)
7675
.block();
7776

7877
if (response == null || !response.isSuccess()) {
7978
throw new GeneralException(ErrorStatus.IMAGE_STOCK_NOT_FOUND);
8079
}
8180

82-
Long stockId = response.getData().getId();
83-
Stock stock = stockRepository.findById(stockId)
84-
.orElseThrow(() -> new GeneralException(ErrorStatus.STOCK_NOT_FOUND));
85-
86-
return StockSearchResponseDTO.builder()
87-
.id(stock.getId())
88-
.name(stock.getName())
89-
.imageUrl(stock.getImageUrl())
81+
return StockSearchFastApiResponseDTO.StockSearchFastApiInfoResponseDTO.builder()
82+
.id(response.getData().getId())
83+
.name(response.getData().getName())
84+
.imageUrl(response.getData().getImageUrl())
85+
.status(response.getData().getStatus())
9086
.build();
9187

9288
} catch (Exception e) {

0 commit comments

Comments
 (0)