193 lines
4.8 KiB
TypeScript
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;
|