조인테이블의 컬럼 사용할 수 있도록 수정
This commit is contained in:
@@ -25,6 +25,7 @@ export class EntityJoinController {
|
||||
sortBy,
|
||||
sortOrder = "asc",
|
||||
enableEntityJoin = true,
|
||||
additionalJoinColumns, // 추가 조인 컬럼 정보 (JSON 문자열)
|
||||
userLang, // userLang은 별도로 분리하여 search에 포함되지 않도록 함
|
||||
...otherParams
|
||||
} = req.query;
|
||||
@@ -49,6 +50,21 @@ export class EntityJoinController {
|
||||
}
|
||||
}
|
||||
|
||||
// 추가 조인 컬럼 정보 처리
|
||||
let parsedAdditionalJoinColumns: any[] = [];
|
||||
if (additionalJoinColumns) {
|
||||
try {
|
||||
parsedAdditionalJoinColumns =
|
||||
typeof additionalJoinColumns === "string"
|
||||
? JSON.parse(additionalJoinColumns)
|
||||
: additionalJoinColumns;
|
||||
logger.info("추가 조인 컬럼 파싱 완료:", parsedAdditionalJoinColumns);
|
||||
} catch (error) {
|
||||
logger.warn("추가 조인 컬럼 파싱 오류:", error);
|
||||
parsedAdditionalJoinColumns = [];
|
||||
}
|
||||
}
|
||||
|
||||
const result = await tableManagementService.getTableDataWithEntityJoins(
|
||||
tableName,
|
||||
{
|
||||
@@ -62,6 +78,7 @@ export class EntityJoinController {
|
||||
sortOrder: sortOrder as string,
|
||||
enableEntityJoin:
|
||||
enableEntityJoin === "true" || enableEntityJoin === true,
|
||||
additionalJoinColumns: parsedAdditionalJoinColumns,
|
||||
}
|
||||
);
|
||||
|
||||
@@ -295,6 +312,124 @@ export class EntityJoinController {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Entity 조인된 테이블의 추가 컬럼 목록 조회
|
||||
* GET /api/table-management/tables/:tableName/entity-join-columns
|
||||
*/
|
||||
async getEntityJoinColumns(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const { tableName } = req.params;
|
||||
|
||||
logger.info(`Entity 조인 컬럼 조회: ${tableName}`);
|
||||
|
||||
// 1. 현재 테이블의 Entity 조인 설정 조회
|
||||
const joinConfigs = await entityJoinService.detectEntityJoins(tableName);
|
||||
|
||||
if (joinConfigs.length === 0) {
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
message: "Entity 조인 설정이 없습니다.",
|
||||
data: {
|
||||
tableName,
|
||||
joinTables: [],
|
||||
availableColumns: [],
|
||||
},
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. 각 조인 테이블의 컬럼 정보 조회
|
||||
const joinTablesInfo = await Promise.all(
|
||||
joinConfigs.map(async (config) => {
|
||||
try {
|
||||
const columns =
|
||||
await tableManagementService.getReferenceTableColumns(
|
||||
config.referenceTable
|
||||
);
|
||||
|
||||
// 현재 display_column으로 사용 중인 컬럼 제외
|
||||
const availableColumns = columns.filter(
|
||||
(col) => col.columnName !== config.displayColumn
|
||||
);
|
||||
|
||||
return {
|
||||
joinConfig: config,
|
||||
tableName: config.referenceTable,
|
||||
currentDisplayColumn: config.displayColumn,
|
||||
availableColumns: availableColumns.map((col) => ({
|
||||
columnName: col.columnName,
|
||||
columnLabel: col.displayName || col.columnName,
|
||||
dataType: col.dataType,
|
||||
isNullable: true, // 기본값으로 설정
|
||||
maxLength: undefined, // 정보가 없으므로 undefined
|
||||
description: col.displayName,
|
||||
})),
|
||||
};
|
||||
} catch (error) {
|
||||
logger.warn(
|
||||
`참조 테이블 컬럼 조회 실패: ${config.referenceTable}`,
|
||||
error
|
||||
);
|
||||
return {
|
||||
joinConfig: config,
|
||||
tableName: config.referenceTable,
|
||||
currentDisplayColumn: config.displayColumn,
|
||||
availableColumns: [],
|
||||
error: error instanceof Error ? error.message : "Unknown error",
|
||||
};
|
||||
}
|
||||
})
|
||||
);
|
||||
|
||||
// 3. 사용 가능한 모든 컬럼 목록 생성 (중복 제거)
|
||||
const allAvailableColumns: Array<{
|
||||
tableName: string;
|
||||
columnName: string;
|
||||
columnLabel: string;
|
||||
dataType: string;
|
||||
joinAlias: string;
|
||||
suggestedLabel: string;
|
||||
}> = [];
|
||||
|
||||
joinTablesInfo.forEach((info) => {
|
||||
info.availableColumns.forEach((col) => {
|
||||
const joinAlias = `${info.joinConfig.sourceColumn}_${col.columnName}`;
|
||||
const suggestedLabel = col.columnLabel; // 라벨명만 사용
|
||||
|
||||
allAvailableColumns.push({
|
||||
tableName: info.tableName,
|
||||
columnName: col.columnName,
|
||||
columnLabel: col.columnLabel,
|
||||
dataType: col.dataType,
|
||||
joinAlias,
|
||||
suggestedLabel,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
message: "Entity 조인 컬럼 조회 성공",
|
||||
data: {
|
||||
tableName,
|
||||
joinTables: joinTablesInfo,
|
||||
availableColumns: allAvailableColumns,
|
||||
summary: {
|
||||
totalJoinTables: joinConfigs.length,
|
||||
totalAvailableColumns: allAvailableColumns.length,
|
||||
},
|
||||
},
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error("Entity 조인 컬럼 조회 실패", error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: "Entity 조인 컬럼 조회 중 오류가 발생했습니다.",
|
||||
error: error instanceof Error ? error.message : "Unknown error",
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 공통 참조 테이블 자동 캐싱
|
||||
* POST /api/table-management/cache/preload
|
||||
|
||||
Reference in New Issue
Block a user