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;