import { Router, Request, Response } from "express"; import { authenticateToken, AuthenticatedRequest, } from "../middleware/authMiddleware"; import { ExternalRestApiConnectionService } from "../services/externalRestApiConnectionService"; import { ExternalRestApiConnection, ExternalRestApiConnectionFilter, RestApiTestRequest, } from "../types/externalRestApiTypes"; import logger from "../utils/logger"; const router = Router(); /** * GET /api/external-rest-api-connections * REST API 연결 목록 조회 */ router.get( "/", authenticateToken, async (req: AuthenticatedRequest, res: Response) => { try { const filter: ExternalRestApiConnectionFilter = { search: req.query.search as string, auth_type: req.query.auth_type as string, is_active: req.query.is_active as string, company_code: req.query.company_code as string, }; const userCompanyCode = req.user?.companyCode; const result = await ExternalRestApiConnectionService.getConnections( filter, userCompanyCode ); return res.status(result.success ? 200 : 400).json(result); } catch (error) { logger.error("REST API 연결 목록 조회 오류:", error); return res.status(500).json({ success: false, message: "서버 내부 오류가 발생했습니다.", error: error instanceof Error ? error.message : "알 수 없는 오류", }); } } ); /** * GET /api/external-rest-api-connections/:id * REST API 연결 상세 조회 */ router.get( "/:id", authenticateToken, async (req: AuthenticatedRequest, res: Response) => { try { const id = parseInt(req.params.id); if (isNaN(id)) { return res.status(400).json({ success: false, message: "유효하지 않은 ID입니다.", }); } const userCompanyCode = req.user?.companyCode; const result = await ExternalRestApiConnectionService.getConnectionById( id, userCompanyCode ); return res.status(result.success ? 200 : 404).json(result); } catch (error) { logger.error("REST API 연결 상세 조회 오류:", error); return res.status(500).json({ success: false, message: "서버 내부 오류가 발생했습니다.", error: error instanceof Error ? error.message : "알 수 없는 오류", }); } } ); /** * POST /api/external-rest-api-connections * REST API 연결 생성 */ router.post( "/", authenticateToken, async (req: AuthenticatedRequest, res: Response) => { try { const data: ExternalRestApiConnection = { ...req.body, created_by: req.user?.userId || "system", }; const result = await ExternalRestApiConnectionService.createConnection(data); return res.status(result.success ? 201 : 400).json(result); } catch (error) { logger.error("REST API 연결 생성 오류:", error); return res.status(500).json({ success: false, message: "서버 내부 오류가 발생했습니다.", error: error instanceof Error ? error.message : "알 수 없는 오류", }); } } ); /** * PUT /api/external-rest-api-connections/:id * REST API 연결 수정 */ router.put( "/:id", authenticateToken, async (req: AuthenticatedRequest, res: Response) => { try { const id = parseInt(req.params.id); if (isNaN(id)) { return res.status(400).json({ success: false, message: "유효하지 않은 ID입니다.", }); } const data: Partial = { ...req.body, updated_by: req.user?.userId || "system", }; const userCompanyCode = req.user?.companyCode; const result = await ExternalRestApiConnectionService.updateConnection( id, data, userCompanyCode ); return res.status(result.success ? 200 : 400).json(result); } catch (error) { logger.error("REST API 연결 수정 오류:", error); return res.status(500).json({ success: false, message: "서버 내부 오류가 발생했습니다.", error: error instanceof Error ? error.message : "알 수 없는 오류", }); } } ); /** * DELETE /api/external-rest-api-connections/:id * REST API 연결 삭제 */ router.delete( "/:id", authenticateToken, async (req: AuthenticatedRequest, res: Response) => { try { const id = parseInt(req.params.id); if (isNaN(id)) { return res.status(400).json({ success: false, message: "유효하지 않은 ID입니다.", }); } const userCompanyCode = req.user?.companyCode; const result = await ExternalRestApiConnectionService.deleteConnection( id, userCompanyCode ); return res.status(result.success ? 200 : 404).json(result); } catch (error) { logger.error("REST API 연결 삭제 오류:", error); return res.status(500).json({ success: false, message: "서버 내부 오류가 발생했습니다.", error: error instanceof Error ? error.message : "알 수 없는 오류", }); } } ); /** * POST /api/external-rest-api-connections/test * REST API 연결 테스트 (테스트 데이터 기반) */ router.post( "/test", authenticateToken, async (req: AuthenticatedRequest, res: Response) => { try { const testRequest: RestApiTestRequest = req.body; if (!testRequest.base_url) { return res.status(400).json({ success: false, message: "기본 URL은 필수입니다.", }); } const result = await ExternalRestApiConnectionService.testConnection(testRequest); return res.status(200).json(result); } catch (error) { logger.error("REST API 연결 테스트 오류:", error); return res.status(500).json({ success: false, message: "서버 내부 오류가 발생했습니다.", error: error instanceof Error ? error.message : "알 수 없는 오류", }); } } ); /** * POST /api/external-rest-api-connections/:id/test * REST API 연결 테스트 (ID 기반) */ router.post( "/:id/test", authenticateToken, async (req: AuthenticatedRequest, res: Response) => { try { const id = parseInt(req.params.id); if (isNaN(id)) { return res.status(400).json({ success: false, message: "유효하지 않은 ID입니다.", }); } const endpoint = req.body.endpoint as string | undefined; const result = await ExternalRestApiConnectionService.testConnectionById( id, endpoint ); return res.status(200).json(result); } catch (error) { logger.error("REST API 연결 테스트 (ID) 오류:", error); return res.status(500).json({ success: false, message: "서버 내부 오류가 발생했습니다.", error: error instanceof Error ? error.message : "알 수 없는 오류", }); } } ); export default router;