ERP-node/backend-node/src/routes/externalCallRoutes.ts

193 lines
4.8 KiB
TypeScript

import { Router, Request, Response } from "express";
import { ExternalCallService } from "../services/externalCallService";
import {
ExternalCallRequest,
SupportedExternalCallSettings,
} from "../types/externalCallTypes";
const router = Router();
const externalCallService = new ExternalCallService();
/**
* 외부 호출 테스트
* POST /api/external-calls/test
*/
router.post("/test", async (req: Request, res: Response) => {
try {
const { settings, templateData } = req.body;
if (!settings) {
return res.status(400).json({
success: false,
error: "외부 호출 설정이 필요합니다.",
});
}
// 설정 검증
const validation = externalCallService.validateSettings(
settings as SupportedExternalCallSettings
);
if (!validation.valid) {
return res.status(400).json({
success: false,
error: "설정 검증 실패",
details: validation.errors,
});
}
// 테스트 요청 생성
const testRequest: ExternalCallRequest = {
diagramId: 0, // 테스트용
relationshipId: "test",
settings: settings as SupportedExternalCallSettings,
templateData: templateData || {
recordCount: 5,
tableName: "test_table",
timestamp: new Date().toISOString(),
},
};
// 외부 호출 실행
const result = await externalCallService.executeExternalCall(testRequest);
return res.json({
success: true,
result,
});
} catch (error) {
console.error("외부 호출 테스트 실패:", error);
return res.status(500).json({
success: false,
error:
error instanceof Error
? error.message
: "알 수 없는 오류가 발생했습니다.",
});
}
});
/**
* 외부 호출 실행
* POST /api/external-calls/execute
*/
router.post("/execute", async (req: Request, res: Response) => {
try {
const { diagramId, relationshipId, settings, templateData } = req.body;
if (!diagramId || !relationshipId || !settings) {
return res.status(400).json({
success: false,
error:
"필수 파라미터가 누락되었습니다. (diagramId, relationshipId, settings)",
});
}
// 설정 검증
const validation = externalCallService.validateSettings(
settings as SupportedExternalCallSettings
);
if (!validation.valid) {
return res.status(400).json({
success: false,
error: "설정 검증 실패",
details: validation.errors,
});
}
// 외부 호출 요청 생성
const callRequest: ExternalCallRequest = {
diagramId: parseInt(diagramId),
relationshipId,
settings: settings as SupportedExternalCallSettings,
templateData,
};
// 외부 호출 실행
const result = await externalCallService.executeExternalCall(callRequest);
// TODO: 호출 결과를 데이터베이스에 로그로 저장 (향후 구현)
return res.json({
success: true,
result,
});
} catch (error) {
console.error("외부 호출 실행 실패:", error);
return res.status(500).json({
success: false,
error:
error instanceof Error
? error.message
: "알 수 없는 오류가 발생했습니다.",
});
}
});
/**
* 지원되는 외부 호출 타입 목록 조회
* GET /api/external-calls/types
*/
router.get("/types", (req: Request, res: Response) => {
res.json({
success: true,
supportedTypes: {
"rest-api": {
name: "REST API 호출",
subtypes: {
slack: "슬랙 웹훅",
"kakao-talk": "카카오톡 알림",
discord: "디스코드 웹훅",
generic: "일반 REST API",
},
},
email: {
name: "이메일 전송",
status: "구현 예정",
},
ftp: {
name: "FTP 업로드",
status: "구현 예정",
},
queue: {
name: "메시지 큐",
status: "구현 예정",
},
},
});
});
/**
* 외부 호출 설정 검증
* POST /api/external-calls/validate
*/
router.post("/validate", (req: Request, res: Response) => {
try {
const { settings } = req.body;
if (!settings) {
return res.status(400).json({
success: false,
error: "검증할 설정이 필요합니다.",
});
}
const validation = externalCallService.validateSettings(
settings as SupportedExternalCallSettings
);
return res.json({
success: true,
validation,
});
} catch (error) {
console.error("설정 검증 실패:", error);
return res.status(500).json({
success: false,
error:
error instanceof Error ? error.message : "검증 중 오류가 발생했습니다.",
});
}
});
export default router;