import { Router } from "express"; import { entityJoinController } from "../controllers/entityJoinController"; import { authenticateToken } from "../middleware/authMiddleware"; const router = Router(); // 모든 라우트에 인증 미들웨어 적용 (테스트 시에는 주석 처리) // router.use(authenticateToken); /** * Entity 조인 기능 라우트 * * 🎯 핵심 기능: * - Entity 조인이 포함된 테이블 데이터 조회 * - Entity 조인 설정 관리 * - 참조 테이블 컬럼 정보 조회 * - 캐시 상태 및 관리 */ // ======================================== // 🎯 Entity 조인 데이터 조회 // ======================================== /** * Entity 조인이 포함된 테이블 데이터 조회 * GET /api/table-management/tables/:tableName/data-with-joins * * Query Parameters: * - page: 페이지 번호 (default: 1) * - size: 페이지 크기 (default: 20) * - sortBy: 정렬 컬럼 * - sortOrder: 정렬 순서 (asc/desc) * - enableEntityJoin: Entity 조인 활성화 (default: true) * - [기타]: 검색 조건 (컬럼명=값) * * Response: * { * success: true, * data: { * data: [...], // 조인된 데이터 * total: 100, * page: 1, * size: 20, * totalPages: 5, * entityJoinInfo?: { * joinConfigs: [...], * strategy: "full_join" | "cache_lookup", * performance: { queryTime: 50, cacheHitRate?: 0.95 } * } * } * } */ router.get( "/tables/:tableName/data-with-joins", entityJoinController.getTableDataWithJoins.bind(entityJoinController) ); // ======================================== // 🎯 Entity 조인 설정 관리 // ======================================== /** * 테이블의 Entity 조인 설정 조회 * GET /api/table-management/tables/:tableName/entity-joins * * Response: * { * success: true, * data: { * tableName: "companies", * joinConfigs: [ * { * sourceTable: "companies", * sourceColumn: "writer", * referenceTable: "user_info", * referenceColumn: "user_id", * displayColumn: "user_name", * aliasColumn: "writer_name" * } * ], * count: 1 * } * } */ router.get( "/tables/:tableName/entity-joins", entityJoinController.getEntityJoinConfigs.bind(entityJoinController) ); /** * 컬럼 Entity 설정 업데이트 * PUT /api/table-management/tables/:tableName/columns/:columnName/entity-settings * * Body: * { * webType: "entity", * referenceTable: "user_info", * referenceColumn: "user_id", * displayColumn: "user_name", // 🎯 새로 추가된 필드 * columnLabel?: "작성자", * description?: "작성자 정보" * } * * Response: * { * success: true, * data: { * tableName: "companies", * columnName: "writer", * settings: { ... } * } * } */ router.put( "/tables/:tableName/columns/:columnName/entity-settings", entityJoinController.updateEntitySettings.bind(entityJoinController) ); // ======================================== // 🎯 참조 테이블 정보 // ======================================== /** * 참조 테이블의 표시 가능한 컬럼 목록 조회 * GET /api/table-management/reference-tables/:tableName/columns * * Response: * { * success: true, * data: { * tableName: "user_info", * columns: [ * { * columnName: "user_id", * displayName: "user_id", * dataType: "character varying" * }, * { * columnName: "user_name", * displayName: "user_name", * dataType: "character varying" * } * ], * count: 2 * } * } */ router.get( "/reference-tables/:tableName/columns", entityJoinController.getReferenceTableColumns.bind(entityJoinController) ); // ======================================== // 🎯 캐시 관리 // ======================================== /** * 캐시 상태 조회 * GET /api/table-management/cache/status * * Response: * { * success: true, * data: { * overallHitRate: 0.95, * caches: [ * { * cacheKey: "user_info.user_id.user_name", * size: 150, * hitRate: 0.98, * lastUpdated: "2024-01-15T10:30:00Z" * } * ], * summary: { * totalCaches: 3, * totalSize: 450, * averageHitRate: 0.93 * } * } * } */ router.get( "/cache/status", entityJoinController.getCacheStatus.bind(entityJoinController) ); /** * 캐시 무효화 * DELETE /api/table-management/cache * * Query Parameters (선택적): * - table: 특정 테이블 캐시만 무효화 * - keyColumn: 키 컬럼 * - displayColumn: 표시 컬럼 * * 모든 파라미터가 없으면 전체 캐시 무효화 * * Response: * { * success: true, * data: { * target: "user_info.user_id.user_name" | "전체" * } * } */ router.delete( "/cache", entityJoinController.invalidateCache.bind(entityJoinController) ); /** * 공통 참조 테이블 자동 캐싱 * POST /api/table-management/cache/preload * * 일반적으로 자주 사용되는 참조 테이블들을 자동으로 캐싱 * - user_info (사용자 정보) * - comm_code (공통 코드) * - dept_info (부서 정보) * - companies (회사 정보) * * Response: * { * success: true, * data: { * preloadedCaches: 4, * caches: [...] * } * } */ router.post( "/cache/preload", entityJoinController.preloadCommonCaches.bind(entityJoinController) ); export default router;