301 lines
7.3 KiB
TypeScript
301 lines
7.3 KiB
TypeScript
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)
|
|
);
|
|
|
|
// ========================================
|
|
// 🎯 참조 테이블 정보
|
|
// ========================================
|
|
|
|
/**
|
|
* Entity 조인된 테이블의 추가 컬럼 목록 조회 (화면편집기용)
|
|
* GET /api/table-management/tables/:tableName/entity-join-columns
|
|
*
|
|
* 특정 테이블에 설정된 모든 Entity 조인의 참조 테이블들에서
|
|
* 추가로 표시할 수 있는 컬럼들의 목록을 반환합니다.
|
|
*
|
|
* Response:
|
|
* {
|
|
* success: true,
|
|
* data: {
|
|
* tableName: "companies",
|
|
* joinTables: [
|
|
* {
|
|
* joinConfig: { sourceColumn: "writer", referenceTable: "user_info", ... },
|
|
* tableName: "user_info",
|
|
* currentDisplayColumn: "user_name",
|
|
* availableColumns: [
|
|
* {
|
|
* columnName: "email",
|
|
* columnLabel: "이메일",
|
|
* dataType: "character varying",
|
|
* isNullable: true,
|
|
* description: "사용자 이메일"
|
|
* },
|
|
* {
|
|
* columnName: "dept_code",
|
|
* columnLabel: "부서코드",
|
|
* dataType: "character varying",
|
|
* isNullable: false,
|
|
* description: "소속 부서"
|
|
* }
|
|
* ]
|
|
* }
|
|
* ],
|
|
* availableColumns: [
|
|
* {
|
|
* tableName: "user_info",
|
|
* columnName: "email",
|
|
* columnLabel: "이메일",
|
|
* dataType: "character varying",
|
|
* joinAlias: "writer_email",
|
|
* suggestedLabel: "writer (이메일)"
|
|
* },
|
|
* {
|
|
* tableName: "user_info",
|
|
* columnName: "dept_code",
|
|
* columnLabel: "부서코드",
|
|
* dataType: "character varying",
|
|
* joinAlias: "writer_dept_code",
|
|
* suggestedLabel: "writer (부서코드)"
|
|
* }
|
|
* ],
|
|
* summary: {
|
|
* totalJoinTables: 1,
|
|
* totalAvailableColumns: 2
|
|
* }
|
|
* }
|
|
* }
|
|
*/
|
|
router.get(
|
|
"/tables/:tableName/entity-join-columns",
|
|
entityJoinController.getEntityJoinColumns.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;
|