213 lines
4.8 KiB
TypeScript
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;
|