/** * 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 ); /** * 테이블 삭제 * DELETE /api/ddl/tables/:tableName */ router.delete( "/tables/:tableName", authenticateToken, requireSuperAdmin, validateDDLPermission, DDLController.dropTable ); /** * 테이블 생성 사전 검증 (실제 생성하지 않고 검증만) * 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", drop: "DELETE /api/ddl/tables/:tableName", 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;