feat: 테이블 참조 관계 조회 로직 개선 및 로깅 강화
- getReferencedByTables 함수에서 현재 사용자의 company_code를 우선적으로 사용하도록 로직을 개선하였습니다. - SQL 쿼리에서 ROW_NUMBER를 활용하여 같은 테이블/컬럼 조합에서 회사코드 우선순위로 하나만 선택하도록 하였습니다. - 로깅 메시지에 회사코드를 포함시켜, 조회 시 어떤 회사의 데이터가 사용되었는지 명확히 기록하도록 하였습니다.
This commit is contained in:
parent
2fb6dd0c32
commit
21a663a99b
|
|
@ -2344,6 +2344,8 @@ export async function getTableEntityRelations(
|
||||||
*
|
*
|
||||||
* table_type_columns에서 reference_table이 현재 테이블인 레코드를 찾아서
|
* table_type_columns에서 reference_table이 현재 테이블인 레코드를 찾아서
|
||||||
* 해당 테이블과 FK 컬럼 정보를 반환합니다.
|
* 해당 테이블과 FK 컬럼 정보를 반환합니다.
|
||||||
|
*
|
||||||
|
* 우선순위: 현재 사용자의 company_code > 공통('*')
|
||||||
*/
|
*/
|
||||||
export async function getReferencedByTables(
|
export async function getReferencedByTables(
|
||||||
req: AuthenticatedRequest,
|
req: AuthenticatedRequest,
|
||||||
|
|
@ -2351,9 +2353,11 @@ export async function getReferencedByTables(
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
try {
|
try {
|
||||||
const { tableName } = req.params;
|
const { tableName } = req.params;
|
||||||
|
// 현재 사용자의 회사 코드 (없으면 '*' 사용)
|
||||||
|
const userCompanyCode = req.user?.companyCode || "*";
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
`=== 테이블 참조 관계 조회 시작: ${tableName} 을 참조하는 테이블 ===`
|
`=== 테이블 참조 관계 조회 시작: ${tableName} 을 참조하는 테이블 (회사코드: ${userCompanyCode}) ===`
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!tableName) {
|
if (!tableName) {
|
||||||
|
|
@ -2371,23 +2375,41 @@ export async function getReferencedByTables(
|
||||||
|
|
||||||
// table_type_columns에서 reference_table이 현재 테이블인 레코드 조회
|
// table_type_columns에서 reference_table이 현재 테이블인 레코드 조회
|
||||||
// input_type이 'entity'인 것만 조회 (실제 FK 관계)
|
// input_type이 'entity'인 것만 조회 (실제 FK 관계)
|
||||||
|
// 우선순위: 현재 사용자의 company_code > 공통('*')
|
||||||
|
// ROW_NUMBER를 사용해서 같은 테이블/컬럼 조합에서 회사코드 우선순위로 하나만 선택
|
||||||
const sqlQuery = `
|
const sqlQuery = `
|
||||||
|
WITH ranked AS (
|
||||||
|
SELECT
|
||||||
|
ttc.table_name,
|
||||||
|
ttc.column_name,
|
||||||
|
ttc.column_label,
|
||||||
|
ttc.reference_table,
|
||||||
|
ttc.reference_column,
|
||||||
|
ttc.display_column,
|
||||||
|
ttc.company_code,
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
PARTITION BY ttc.table_name, ttc.column_name
|
||||||
|
ORDER BY CASE WHEN ttc.company_code = $2 THEN 1 ELSE 2 END
|
||||||
|
) as rn
|
||||||
|
FROM table_type_columns ttc
|
||||||
|
WHERE ttc.reference_table = $1
|
||||||
|
AND ttc.input_type = 'entity'
|
||||||
|
AND ttc.company_code IN ($2, '*')
|
||||||
|
)
|
||||||
SELECT DISTINCT
|
SELECT DISTINCT
|
||||||
ttc.table_name,
|
table_name,
|
||||||
ttc.column_name,
|
column_name,
|
||||||
ttc.column_label,
|
column_label,
|
||||||
ttc.reference_table,
|
reference_table,
|
||||||
ttc.reference_column,
|
reference_column,
|
||||||
ttc.display_column,
|
display_column,
|
||||||
ttc.table_name as table_label
|
table_name as table_label
|
||||||
FROM table_type_columns ttc
|
FROM ranked
|
||||||
WHERE ttc.reference_table = $1
|
WHERE rn = 1
|
||||||
AND ttc.input_type = 'entity'
|
ORDER BY table_name, column_name
|
||||||
AND ttc.company_code = '*'
|
|
||||||
ORDER BY ttc.table_name, ttc.column_name
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const result = await query(sqlQuery, [tableName]);
|
const result = await query(sqlQuery, [tableName, userCompanyCode]);
|
||||||
|
|
||||||
const referencedByTables = result.map((row: any) => ({
|
const referencedByTables = result.map((row: any) => ({
|
||||||
tableName: row.table_name,
|
tableName: row.table_name,
|
||||||
|
|
@ -2400,7 +2422,7 @@ export async function getReferencedByTables(
|
||||||
}));
|
}));
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
`테이블 참조 관계 조회 완료: ${referencedByTables.length}개 발견`
|
`테이블 참조 관계 조회 완료: ${referencedByTables.length}개 발견 (회사코드: ${userCompanyCode})`
|
||||||
);
|
);
|
||||||
|
|
||||||
const response: ApiResponse<any> = {
|
const response: ApiResponse<any> = {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue