외부호출 기능(rest API)

This commit is contained in:
kjs
2025-09-26 17:11:18 +09:00
parent 9454e3a81f
commit 11b71b788a
19 changed files with 3177 additions and 243 deletions

View File

@@ -114,6 +114,9 @@ const DataConnectionDesigner: React.FC<DataConnectionDesignerProps> = ({
controlConditions: initialData.controlConditions || prev.controlConditions,
fieldMappings: initialData.fieldMappings || prev.fieldMappings,
// 🔧 외부호출 설정 로드
externalCallConfig: initialData.externalCallConfig || prev.externalCallConfig,
// 🔧 액션 그룹 데이터 로드 (기존 호환성 포함)
actionGroups:
initialData.actionGroups ||
@@ -155,6 +158,7 @@ const DataConnectionDesigner: React.FC<DataConnectionDesignerProps> = ({
const actions: DataConnectionActions = {
// 연결 타입 설정
setConnectionType: useCallback((type: "data_save" | "external_call") => {
console.log("🔄 [DataConnectionDesigner] setConnectionType 호출됨:", type);
setState((prev) => ({
...prev,
connectionType: type,
@@ -376,6 +380,15 @@ const DataConnectionDesigner: React.FC<DataConnectionDesignerProps> = ({
toast.success("제어 조건이 삭제되었습니다.");
}, []),
// 외부호출 설정 업데이트
updateExternalCallConfig: useCallback((config: any) => {
console.log("🔄 외부호출 설정 업데이트:", config);
setState((prev) => ({
...prev,
externalCallConfig: config,
}));
}, []),
// 액션 설정 관리
setActionType: useCallback((type: "insert" | "update" | "delete" | "upsert") => {
setState((prev) => ({
@@ -534,6 +547,15 @@ const DataConnectionDesigner: React.FC<DataConnectionDesignerProps> = ({
return;
}
// 외부호출인 경우 API URL만 확인 (테이블 검증 제외)
if (state.connectionType === "external_call") {
if (!state.externalCallConfig?.restApiSettings?.apiUrl) {
toast.error("API URL을 입력해주세요.");
return;
}
// 외부호출은 테이블 정보 검증 건너뛰기
}
// 중복 체크 (수정 모드가 아닌 경우에만)
if (!diagramId) {
try {
@@ -558,22 +580,62 @@ const DataConnectionDesigner: React.FC<DataConnectionDesignerProps> = ({
relationshipName: state.relationshipName,
description: state.description,
connectionType: state.connectionType,
fromConnection: state.fromConnection,
toConnection: state.toConnection,
fromTable: state.fromTable,
toTable: state.toTable,
// 외부호출인 경우 테이블 정보는 선택사항
fromConnection: state.connectionType === "external_call" ? null : state.fromConnection,
toConnection: state.connectionType === "external_call" ? null : state.toConnection,
fromTable: state.connectionType === "external_call" ? null : state.fromTable,
toTable: state.connectionType === "external_call" ? null : state.toTable,
// 🔧 멀티 액션 그룹 데이터 포함
actionGroups: state.actionGroups,
actionGroups: state.connectionType === "external_call" ? [] : state.actionGroups,
groupsLogicalOperator: state.groupsLogicalOperator,
// 외부호출 설정 포함
externalCallConfig: state.externalCallConfig,
// 기존 호환성을 위한 필드들 (첫 번째 액션 그룹의 첫 번째 액션에서 추출)
actionType: state.actionGroups[0]?.actions[0]?.actionType || state.actionType || "insert",
controlConditions: state.controlConditions,
actionConditions: state.actionGroups[0]?.actions[0]?.conditions || state.actionConditions || [],
fieldMappings: state.actionGroups[0]?.actions[0]?.fieldMappings || state.fieldMappings || [],
actionType:
state.connectionType === "external_call"
? "external_call"
: state.actionGroups[0]?.actions[0]?.actionType || state.actionType || "insert",
controlConditions: state.connectionType === "external_call" ? [] : state.controlConditions,
actionConditions:
state.connectionType === "external_call"
? []
: state.actionGroups[0]?.actions[0]?.conditions || state.actionConditions || [],
fieldMappings:
state.connectionType === "external_call"
? []
: state.actionGroups[0]?.actions[0]?.fieldMappings || state.fieldMappings || [],
};
console.log("💾 직접 저장 시작:", { saveData, diagramId, isEdit: !!diagramId });
// 외부호출인 경우 external-call-configs에 설정 저장
if (state.connectionType === "external_call" && state.externalCallConfig) {
try {
const { ExternalCallConfigAPI } = await import("@/lib/api/externalCallConfig");
const configData = {
config_name: state.relationshipName || "외부호출 설정",
call_type: "rest-api",
api_type: "generic",
config_data: state.externalCallConfig.restApiSettings,
description: state.description || "",
company_code: "*", // 기본값
};
const configResult = await ExternalCallConfigAPI.createConfig(configData);
if (!configResult.success) {
throw new Error(configResult.error || "외부호출 설정 저장 실패");
}
console.log("✅ 외부호출 설정 저장 완료:", configResult.data);
} catch (configError) {
console.error("❌ 외부호출 설정 저장 실패:", configError);
// 외부호출 설정 저장 실패해도 관계는 저장하도록 함
toast.error("외부호출 설정 저장에 실패했지만 관계는 저장되었습니다.");
}
}
// 백엔드 API 호출 (수정 모드인 경우 diagramId 전달)
const result = await saveDataflowRelationship(saveData, diagramId);
@@ -641,15 +703,15 @@ const DataConnectionDesigner: React.FC<DataConnectionDesignerProps> = ({
)}
{/* 메인 컨텐츠 - 좌우 분할 레이아웃 */}
<div className="flex h-[calc(100vh-280px)] min-h-[600px] overflow-hidden">
{/* 좌측 패널 (30%) */}
<div className="flex h-[calc(100vh-200px)] min-h-[700px] overflow-hidden">
{/* 좌측 패널 (30%) - 항상 표시 */}
<div className="flex w-[30%] flex-col border-r bg-white">
<LeftPanel state={state} actions={actions} />
</div>
{/* 우측 패널 (70%) */}
<div className="flex w-[70%] flex-col bg-gray-50">
<RightPanel state={state} actions={actions} />
<RightPanel key={state.connectionType} state={state} actions={actions} />
</div>
</div>
</div>