67 lines
2.9 KiB
Java
67 lines
2.9 KiB
Java
package com.erp.service;
|
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.springframework.http.*;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.web.client.ResourceAccessException;
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
|
import java.net.URI;
|
|
import java.util.*;
|
|
|
|
@Service
|
|
@Slf4j
|
|
public class AiAssistantProxyService {
|
|
|
|
private static final String AI_SERVICE_BASE =
|
|
System.getenv().getOrDefault("AI_ASSISTANT_SERVICE_URL", "http://127.0.0.1:3100");
|
|
|
|
private final ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
public ResponseEntity<byte[]> forward(String path, String query,
|
|
HttpMethod method, HttpHeaders incomingHeaders,
|
|
byte[] body) {
|
|
String url = AI_SERVICE_BASE + "/api/v1" + path;
|
|
if (query != null && !query.isEmpty()) {
|
|
url += "?" + query;
|
|
}
|
|
try {
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
HttpHeaders headers = new HttpHeaders();
|
|
MediaType contentType = incomingHeaders.getContentType();
|
|
if (contentType != null) headers.setContentType(contentType);
|
|
String auth = incomingHeaders.getFirst(HttpHeaders.AUTHORIZATION);
|
|
if (auth != null) headers.set(HttpHeaders.AUTHORIZATION, auth);
|
|
String accept = incomingHeaders.getFirst(HttpHeaders.ACCEPT);
|
|
if (accept != null) headers.set(HttpHeaders.ACCEPT, accept);
|
|
|
|
RequestEntity<byte[]> requestEntity = new RequestEntity<>(body, headers, method, URI.create(url));
|
|
return restTemplate.exchange(requestEntity, byte[].class);
|
|
} catch (ResourceAccessException e) {
|
|
log.warn("AI service unavailable at {}: {}", url, e.getMessage());
|
|
return buildServiceUnavailableResponse();
|
|
} catch (Exception e) {
|
|
log.error("AI proxy error: {}", e.getMessage());
|
|
return buildServiceUnavailableResponse();
|
|
}
|
|
}
|
|
|
|
private ResponseEntity<byte[]> buildServiceUnavailableResponse() {
|
|
try {
|
|
Map<String, Object> error = new HashMap<>();
|
|
error.put("success", false);
|
|
Map<String, Object> errorDetail = new HashMap<>();
|
|
errorDetail.put("code", "AI_SERVICE_UNAVAILABLE");
|
|
errorDetail.put("message", "AI 어시스턴트 서비스를 사용할 수 없습니다. AI 서비스(기본 3100 포트)를 기동한 뒤 다시 시도하세요.");
|
|
error.put("error", errorDetail);
|
|
byte[] body = objectMapper.writeValueAsBytes(error);
|
|
return ResponseEntity.status(HttpStatus.BAD_GATEWAY)
|
|
.contentType(MediaType.APPLICATION_JSON)
|
|
.body(body);
|
|
} catch (Exception ex) {
|
|
return ResponseEntity.status(HttpStatus.BAD_GATEWAY).build();
|
|
}
|
|
}
|
|
}
|