테이블 및 컬럼 생성기능 추가
This commit is contained in:
215
backend-node/src/routes/ddlRoutes.ts
Normal file
215
backend-node/src/routes/ddlRoutes.ts
Normal file
@@ -0,0 +1,215 @@
|
||||
/**
|
||||
* DDL 실행 관련 라우터
|
||||
* 테이블/컬럼 생성 API 라우팅
|
||||
*/
|
||||
|
||||
import express from "express";
|
||||
import { DDLController } from "../controllers/ddlController";
|
||||
import {
|
||||
requireSuperAdmin,
|
||||
validateDDLPermission,
|
||||
} from "../middleware/superAdminMiddleware";
|
||||
import { authenticateToken } from "../middleware/authMiddleware";
|
||||
|
||||
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 {
|
||||
// 기본적인 데이터베이스 연결 테스트
|
||||
const { PrismaClient } = await import("@prisma/client");
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
await prisma.$queryRaw`SELECT 1`;
|
||||
await prisma.$disconnect();
|
||||
|
||||
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;
|
||||
Reference in New Issue
Block a user