Files
invyone/backend-spring/src/main/java/com/erp/service/AiAssistantProxyService.java
T

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();
}
}
}