단순 키 연결 구현 시 증계 테입르에 레코드 생성 구현
This commit is contained in:
@@ -56,27 +56,63 @@ export class DataflowService {
|
||||
);
|
||||
}
|
||||
|
||||
// 새 관계 생성
|
||||
const relationship = await prisma.table_relationships.create({
|
||||
data: {
|
||||
relationship_name: data.relationshipName,
|
||||
from_table_name: data.fromTableName,
|
||||
from_column_name: data.fromColumnName,
|
||||
to_table_name: data.toTableName,
|
||||
to_column_name: data.toColumnName,
|
||||
relationship_type: data.relationshipType,
|
||||
connection_type: data.connectionType,
|
||||
company_code: data.companyCode,
|
||||
settings: data.settings,
|
||||
created_by: data.createdBy,
|
||||
updated_by: data.createdBy,
|
||||
},
|
||||
// 트랜잭션으로 관계 생성과 단순 키값 연결 처리
|
||||
const result = await prisma.$transaction(async (tx) => {
|
||||
// 1. 새 관계 생성
|
||||
const relationship = await tx.table_relationships.create({
|
||||
data: {
|
||||
relationship_name: data.relationshipName,
|
||||
from_table_name: data.fromTableName,
|
||||
from_column_name: data.fromColumnName,
|
||||
to_table_name: data.toTableName,
|
||||
to_column_name: data.toColumnName,
|
||||
relationship_type: data.relationshipType,
|
||||
connection_type: data.connectionType,
|
||||
company_code: data.companyCode,
|
||||
settings: data.settings,
|
||||
created_by: data.createdBy,
|
||||
updated_by: data.createdBy,
|
||||
},
|
||||
});
|
||||
|
||||
// 2. 단순 키값 연결인 경우 data_relationship_bridge에도 기본 레코드 생성
|
||||
if (data.connectionType === "simple-key") {
|
||||
logger.info(
|
||||
`단순 키값 연결이므로 data_relationship_bridge에 기본 연결 레코드 생성 - 관계ID: ${relationship.relationship_id}`
|
||||
);
|
||||
|
||||
await tx.data_relationship_bridge.create({
|
||||
data: {
|
||||
relationship_id: relationship.relationship_id,
|
||||
from_table_name: data.fromTableName,
|
||||
from_column_name: data.fromColumnName,
|
||||
to_table_name: data.toTableName,
|
||||
to_column_name: data.toColumnName,
|
||||
connection_type: data.connectionType,
|
||||
company_code: data.companyCode,
|
||||
bridge_data: {
|
||||
autoCreated: true,
|
||||
createdAt: new Date().toISOString(),
|
||||
notes: "단순 키값 연결 - 테이블과 컬럼 관계만 정의",
|
||||
connectionInfo: `${data.fromTableName}.${data.fromColumnName} ↔ ${data.toTableName}.${data.toColumnName}`,
|
||||
settings: data.settings,
|
||||
},
|
||||
created_by: data.createdBy,
|
||||
},
|
||||
});
|
||||
|
||||
logger.info(
|
||||
`단순 키값 연결 기본 레코드 생성 완료 - 관계ID: ${relationship.relationship_id}`
|
||||
);
|
||||
}
|
||||
|
||||
return relationship;
|
||||
});
|
||||
|
||||
logger.info(
|
||||
`DataflowService: 테이블 관계 생성 완료 - ID: ${relationship.relationship_id}`
|
||||
`DataflowService: 테이블 관계 생성 완료 - ID: ${result.relationship_id}`
|
||||
);
|
||||
return relationship;
|
||||
return result;
|
||||
} catch (error) {
|
||||
logger.error("DataflowService: 테이블 관계 생성 실패", error);
|
||||
throw error;
|
||||
@@ -386,12 +422,8 @@ export class DataflowService {
|
||||
relationshipId: number;
|
||||
fromTableName: string;
|
||||
fromColumnName: string;
|
||||
fromKeyValue: string;
|
||||
fromRecordId?: string;
|
||||
toTableName: string;
|
||||
toColumnName: string;
|
||||
toKeyValue: string;
|
||||
toRecordId?: string;
|
||||
connectionType: string;
|
||||
companyCode: string;
|
||||
bridgeData?: any;
|
||||
@@ -407,12 +439,8 @@ export class DataflowService {
|
||||
relationship_id: linkData.relationshipId,
|
||||
from_table_name: linkData.fromTableName,
|
||||
from_column_name: linkData.fromColumnName,
|
||||
from_key_value: linkData.fromKeyValue,
|
||||
from_record_id: linkData.fromRecordId,
|
||||
to_table_name: linkData.toTableName,
|
||||
to_column_name: linkData.toColumnName,
|
||||
to_key_value: linkData.toKeyValue,
|
||||
to_record_id: linkData.toRecordId,
|
||||
connection_type: linkData.connectionType,
|
||||
company_code: linkData.companyCode,
|
||||
bridge_data: linkData.bridgeData || {},
|
||||
@@ -494,13 +522,7 @@ export class DataflowService {
|
||||
is_active: "Y",
|
||||
};
|
||||
|
||||
// 특정 키 값으로 필터링
|
||||
if (keyValue) {
|
||||
whereCondition.OR = [
|
||||
{ from_table_name: tableName, from_key_value: keyValue },
|
||||
{ to_table_name: tableName, to_key_value: keyValue },
|
||||
];
|
||||
}
|
||||
// keyValue 파라미터는 더 이상 사용하지 않음 (key_value 필드 제거됨)
|
||||
|
||||
// 회사코드 필터링
|
||||
if (companyCode && companyCode !== "*") {
|
||||
@@ -537,10 +559,6 @@ export class DataflowService {
|
||||
async updateDataLink(
|
||||
bridgeId: number,
|
||||
updateData: {
|
||||
fromKeyValue?: string;
|
||||
fromRecordId?: string;
|
||||
toKeyValue?: string;
|
||||
toRecordId?: string;
|
||||
bridgeData?: any;
|
||||
updatedBy: string;
|
||||
},
|
||||
@@ -662,4 +680,89 @@ export class DataflowService {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// ==================== 테이블 데이터 조회 ====================
|
||||
|
||||
/**
|
||||
* 테이블 실제 데이터 조회 (페이징)
|
||||
*/
|
||||
async getTableData(
|
||||
tableName: string,
|
||||
page: number = 1,
|
||||
limit: number = 10,
|
||||
search: string = "",
|
||||
searchColumn: string = "",
|
||||
companyCode: string = "*"
|
||||
) {
|
||||
try {
|
||||
logger.info(`DataflowService: 테이블 데이터 조회 시작 - ${tableName}`);
|
||||
|
||||
// 테이블 존재 여부 확인 (정보 스키마 사용)
|
||||
const tableExists = await prisma.$queryRaw`
|
||||
SELECT table_name
|
||||
FROM information_schema.tables
|
||||
WHERE table_name = ${tableName.toLowerCase()}
|
||||
AND table_schema = 'public'
|
||||
`;
|
||||
|
||||
if (
|
||||
!tableExists ||
|
||||
(Array.isArray(tableExists) && tableExists.length === 0)
|
||||
) {
|
||||
throw new Error(`테이블 '${tableName}'이 존재하지 않습니다.`);
|
||||
}
|
||||
|
||||
// 전체 데이터 개수 조회
|
||||
let totalCountQuery = `SELECT COUNT(*) as total FROM "${tableName}"`;
|
||||
let dataQuery = `SELECT * FROM "${tableName}"`;
|
||||
|
||||
// 검색 조건 추가
|
||||
if (search && searchColumn) {
|
||||
const whereCondition = `WHERE "${searchColumn}" ILIKE '%${search}%'`;
|
||||
totalCountQuery += ` ${whereCondition}`;
|
||||
dataQuery += ` ${whereCondition}`;
|
||||
}
|
||||
|
||||
// 페이징 처리
|
||||
const offset = (page - 1) * limit;
|
||||
dataQuery += ` ORDER BY 1 LIMIT ${limit} OFFSET ${offset}`;
|
||||
|
||||
// 실제 쿼리 실행
|
||||
const [totalResult, dataResult] = await Promise.all([
|
||||
prisma.$queryRawUnsafe(totalCountQuery),
|
||||
prisma.$queryRawUnsafe(dataQuery),
|
||||
]);
|
||||
|
||||
const total =
|
||||
Array.isArray(totalResult) && totalResult.length > 0
|
||||
? Number((totalResult[0] as any).total)
|
||||
: 0;
|
||||
|
||||
const data = Array.isArray(dataResult) ? dataResult : [];
|
||||
|
||||
const result = {
|
||||
data,
|
||||
pagination: {
|
||||
page,
|
||||
limit,
|
||||
total,
|
||||
totalPages: Math.ceil(total / limit),
|
||||
hasNext: page < Math.ceil(total / limit),
|
||||
hasPrev: page > 1,
|
||||
},
|
||||
};
|
||||
|
||||
logger.info(
|
||||
`DataflowService: 테이블 데이터 조회 완료 - ${tableName}, 총 ${total}건 중 ${data.length}건 조회`
|
||||
);
|
||||
|
||||
return result;
|
||||
} catch (error) {
|
||||
logger.error(
|
||||
`DataflowService: 테이블 데이터 조회 실패 - ${tableName}`,
|
||||
error
|
||||
);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user