Files
invyone/backend-spring/src/main/java/com/erp/controller/FlowExternalDbConnectionController.java
T

197 lines
9.1 KiB
Java

package com.erp.controller;
import com.erp.dto.ApiResponse;
import com.erp.service.FlowExternalDbConnectionService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 플로우 전용 외부 DB 연결 컨트롤러
*
* GET /api/flow-external-db - 목록 (?activeOnly=true)
* GET /api/flow-external-db/{id} - 단건
* POST /api/flow-external-db - 생성
* PUT /api/flow-external-db/{id} - 수정
* DELETE /api/flow-external-db/{id} - 삭제
* POST /api/flow-external-db/{id}/test - 연결 테스트
* GET /api/flow-external-db/{id}/tables - 테이블 목록
* GET /api/flow-external-db/{id}/tables/{tableName}/columns - 컬럼 목록
*/
@RestController
@RequestMapping("/api/flow-external-db")
@RequiredArgsConstructor
@Slf4j
public class FlowExternalDbConnectionController {
private final FlowExternalDbConnectionService service;
@GetMapping
public ResponseEntity<ApiResponse<List<Map<String, Object>>>> getAll(
@RequestAttribute(value = "company_code", required = false) String companyCode,
@RequestParam(required = false, defaultValue = "false") String activeOnly) {
try {
boolean active = "true".equalsIgnoreCase(activeOnly);
List<Map<String, Object>> connections = service.findAll(active);
return ResponseEntity.ok(ApiResponse.success(connections,
connections.size() + "개의 외부 DB 연결을 조회했습니다"));
} catch (Exception e) {
log.error("외부 DB 연결 목록 조회 오류", e);
return ResponseEntity.status(500)
.body(ApiResponse.error("외부 DB 연결 목록 조회 중 오류가 발생했습니다"));
}
}
@GetMapping("/{id}")
public ResponseEntity<ApiResponse<Map<String, Object>>> getById(
@RequestAttribute("company_code") String companyCode,
@PathVariable int id) {
try {
Map<String, Object> conn = service.findById(id);
if (conn == null) {
return ResponseEntity.status(404)
.body(ApiResponse.error("외부 DB 연결을 찾을 수 없습니다"));
}
return ResponseEntity.ok(ApiResponse.success(conn));
} catch (Exception e) {
log.error("외부 DB 연결 조회 오류: id={}", id, e);
return ResponseEntity.status(500)
.body(ApiResponse.error("외부 DB 연결 조회 중 오류가 발생했습니다"));
}
}
@PostMapping
public ResponseEntity<ApiResponse<Map<String, Object>>> create(
@RequestAttribute("company_code") String companyCode,
@RequestBody Map<String, Object> body) {
// 필수 필드 검증
if (isBlank(body, "name") || isBlank(body, "db_type") || isBlank(body, "db_type") && isBlank(body, "db_type")
|| isBlank(body, "host") || body.get("port") == null
|| isBlank(body, "database_name") && isBlank(body, "database_name")
|| isBlank(body, "username") || isBlank(body, "password")) {
return ResponseEntity.status(400)
.body(ApiResponse.error("필수 필드가 누락되었습니다"));
}
try {
String userId = companyCode != null ? companyCode : "system";
Map<String, Object> conn = service.create(body, userId);
log.info("외부 DB 연결 생성: {}", conn.get("name"));
return ResponseEntity.status(HttpStatus.CREATED)
.body(ApiResponse.success(conn, "외부 DB 연결이 생성되었습니다"));
} catch (Exception e) {
log.error("외부 DB 연결 생성 오류", e);
return ResponseEntity.status(500)
.body(ApiResponse.error("외부 DB 연결 생성 중 오류가 발생했습니다"));
}
}
@PutMapping("/{id}")
public ResponseEntity<ApiResponse<Map<String, Object>>> update(
@RequestAttribute("company_code") String companyCode,
@PathVariable int id,
@RequestBody Map<String, Object> body) {
try {
String userId = companyCode != null ? companyCode : "system";
Map<String, Object> conn = service.update(id, body, userId);
if (conn == null) {
return ResponseEntity.status(404)
.body(ApiResponse.error("외부 DB 연결을 찾을 수 없습니다"));
}
log.info("외부 DB 연결 수정: id={}, name={}", id, conn.get("name"));
return ResponseEntity.ok(ApiResponse.success(conn, "외부 DB 연결이 수정되었습니다"));
} catch (Exception e) {
log.error("외부 DB 연결 수정 오류: id={}", id, e);
return ResponseEntity.status(500)
.body(ApiResponse.error("외부 DB 연결 수정 중 오류가 발생했습니다"));
}
}
@DeleteMapping("/{id}")
public ResponseEntity<ApiResponse<Void>> delete(
@RequestAttribute("company_code") String companyCode,
@PathVariable int id) {
try {
boolean deleted = service.delete(id);
if (!deleted) {
return ResponseEntity.status(404)
.body(ApiResponse.error("외부 DB 연결을 찾을 수 없습니다"));
}
log.info("외부 DB 연결 삭제: id={}", id);
return ResponseEntity.ok(ApiResponse.success(null, "외부 DB 연결이 삭제되었습니다"));
} catch (Exception e) {
log.error("외부 DB 연결 삭제 오류: id={}", id, e);
return ResponseEntity.status(500)
.body(ApiResponse.error("외부 DB 연결 삭제 중 오류가 발생했습니다"));
}
}
@PostMapping("/{id}/test")
public ResponseEntity<ApiResponse<Void>> testConnection(
@RequestAttribute("company_code") String companyCode,
@PathVariable int id) {
try {
Map<String, Object> result = service.testConnection(id);
boolean success = Boolean.TRUE.equals(result.get("success"));
String message = (String) result.get("message");
if (success) {
log.info("외부 DB 연결 테스트 성공: id={}", id);
return ResponseEntity.ok(ApiResponse.success(null, message));
} else {
log.warn("외부 DB 연결 테스트 실패: id={}, msg={}", id, message);
return ResponseEntity.status(400).body(ApiResponse.error(message));
}
} catch (Exception e) {
log.error("외부 DB 연결 테스트 오류: id={}", id, e);
return ResponseEntity.status(500)
.body(ApiResponse.error("외부 DB 연결 테스트 중 오류가 발생했습니다"));
}
}
@GetMapping("/{id}/tables")
public ResponseEntity<?> getTables(
@RequestAttribute(value = "company_code", required = false) String companyCode,
@PathVariable int id) {
try {
Map<String, Object> result = service.getTables(id);
if (Boolean.TRUE.equals(result.get("success"))) {
return ResponseEntity.ok(result);
}
return ResponseEntity.status(400).body(result);
} catch (Exception e) {
log.error("외부 DB 테이블 목록 조회 오류: id={}", id, e);
return ResponseEntity.status(500).body(Map.of(
"success", false, "message", "외부 DB 테이블 목록 조회 중 오류가 발생했습니다"));
}
}
@GetMapping("/{id}/tables/{tableName}/columns")
public ResponseEntity<?> getTableColumns(
@RequestAttribute(value = "company_code", required = false) String companyCode,
@PathVariable int id,
@PathVariable String tableName) {
try {
Map<String, Object> result = service.getTableColumns(id, tableName);
if (Boolean.TRUE.equals(result.get("success"))) {
return ResponseEntity.ok(result);
}
return ResponseEntity.status(400).body(result);
} catch (Exception e) {
log.error("외부 DB 컬럼 목록 조회 오류: id={}, table={}", id, tableName, e);
return ResponseEntity.status(500).body(Map.of(
"success", false, "message", "외부 DB 컬럼 목록 조회 중 오류가 발생했습니다"));
}
}
// ── 유효성 헬퍼 ───────────────────────────────────────────────
private boolean isBlank(Map<String, Object> body, String key) {
Object v = body.get(key);
return v == null || v.toString().isBlank();
}
}