ERP-node/backend-node/src/routes/ddlRoutes.ts

213 lines
4.8 KiB
TypeScript

/**
* DDL 실행 관련 라우터
* 테이블/컬럼 생성 API 라우팅
*/
import express from "express";
import { DDLController } from "../controllers/ddlController";
import {
requireSuperAdmin,
validateDDLPermission,
} from "../middleware/superAdminMiddleware";
import { authenticateToken } from "../middleware/authMiddleware";
import { query } from "../database/db";
const router = express.Router();
// ============================================
// DDL 실행 라우터 (최고 관리자 전용)
// ============================================
/**
* 테이블 생성
* POST /api/ddl/tables
*/
router.post(
"/tables",
authenticateToken, // 기본 인증
requireSuperAdmin, // 슈퍼관리자 권한 확인
validateDDLPermission, // DDL 실행 추가 검증
DDLController.createTable
);
/**
* 컬럼 추가
* POST /api/ddl/tables/:tableName/columns
*/
router.post(
"/tables/:tableName/columns",
authenticateToken,
requireSuperAdmin,
validateDDLPermission,
DDLController.addColumn
);
/**
* 테이블 생성 사전 검증 (실제 생성하지 않고 검증만)
* POST /api/ddl/validate/table
*/
router.post(
"/validate/table",
authenticateToken,
requireSuperAdmin,
DDLController.validateTableCreation
);
// ============================================
// DDL 로그 및 모니터링 라우터
// ============================================
/**
* DDL 실행 로그 조회
* GET /api/ddl/logs
*/
router.get(
"/logs",
authenticateToken,
requireSuperAdmin,
DDLController.getDDLLogs
);
/**
* DDL 실행 통계 조회
* GET /api/ddl/statistics
*/
router.get(
"/statistics",
authenticateToken,
requireSuperAdmin,
DDLController.getDDLStatistics
);
/**
* 특정 테이블의 DDL 히스토리 조회
* GET /api/ddl/tables/:tableName/history
*/
router.get(
"/tables/:tableName/history",
authenticateToken,
requireSuperAdmin,
DDLController.getTableDDLHistory
);
/**
* 생성된 테이블 정보 조회
* GET /api/ddl/tables/:tableName/info
*/
router.get(
"/tables/:tableName/info",
authenticateToken,
requireSuperAdmin,
DDLController.getTableInfo
);
// ============================================
// DDL 시스템 관리 라우터
// ============================================
/**
* 오래된 DDL 로그 정리
* DELETE /api/ddl/logs/cleanup
*/
router.delete(
"/logs/cleanup",
authenticateToken,
requireSuperAdmin,
DDLController.cleanupOldLogs
);
// ============================================
// 라우터 정보 및 헬스체크
// ============================================
/**
* DDL 라우터 정보 조회
* GET /api/ddl/info
*/
router.get("/info", authenticateToken, requireSuperAdmin, (req, res) => {
res.json({
success: true,
data: {
service: "DDL Execution Service",
version: "1.0.0",
description: "PostgreSQL 테이블 및 컬럼 동적 생성 서비스",
endpoints: {
tables: {
create: "POST /api/ddl/tables",
addColumn: "POST /api/ddl/tables/:tableName/columns",
getInfo: "GET /api/ddl/tables/:tableName/info",
getHistory: "GET /api/ddl/tables/:tableName/history",
},
validation: {
validateTable: "POST /api/ddl/validate/table",
},
monitoring: {
logs: "GET /api/ddl/logs",
statistics: "GET /api/ddl/statistics",
cleanup: "DELETE /api/ddl/logs/cleanup",
},
},
requirements: {
authentication: "Bearer Token 필요",
authorization: "회사코드 '*'인 plm_admin 사용자만 접근 가능",
safety: "모든 DDL 실행은 안전성 검증 후 수행",
logging: "모든 DDL 실행은 감사 로그에 기록",
},
supportedWebTypes: [
"text",
"number",
"decimal",
"date",
"datetime",
"boolean",
"code",
"entity",
"textarea",
"select",
"checkbox",
"radio",
"file",
"email",
"tel",
],
},
});
});
/**
* DDL 서비스 헬스체크
* GET /api/ddl/health
*/
router.get("/health", authenticateToken, async (req, res) => {
try {
// 기본적인 데이터베이스 연결 테스트
await query("SELECT 1");
res.json({
success: true,
status: "healthy",
timestamp: new Date().toISOString(),
checks: {
database: "connected",
service: "operational",
},
});
} catch (error) {
res.status(503).json({
success: false,
status: "unhealthy",
timestamp: new Date().toISOString(),
error: {
code: "HEALTH_CHECK_FAILED",
details: "DDL 서비스 상태 확인 실패",
},
checks: {
database: "disconnected",
service: "error",
},
});
}
});
export default router;