ERP-node/backend-node/src/routes/externalRestApiConnectionRo...

271 lines
7.1 KiB
TypeScript

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<ExternalRestApiConnection> = {
...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,
req.user?.companyCode
);
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;