ERP-node/backend-node/src/routes/entityJoinRoutes.ts

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;