271 lines
7.1 KiB
TypeScript
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;
|