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

236 lines
5.4 KiB
TypeScript
Raw Normal View History

2025-09-16 15:13:00 +09:00
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;