Merge branch 'main' of http://39.117.244.52:3000/kjs/ERP-node into feature/report

This commit is contained in:
dohyeons
2025-10-13 09:44:09 +09:00
74 changed files with 20398 additions and 482 deletions

View File

@@ -895,13 +895,18 @@ export class BatchExternalDbService {
);
}
// 데이터 조회
const result = await connector.executeQuery(finalEndpoint, method);
// 데이터 조회 (REST API는 executeRequest 사용)
let result;
if ((connector as any).executeRequest) {
result = await (connector as any).executeRequest(finalEndpoint, method);
} else {
result = await connector.executeQuery(finalEndpoint);
}
let data = result.rows;
// 컬럼 필터링 (지정된 컬럼만 추출)
if (columns && columns.length > 0) {
data = data.map((row) => {
data = data.map((row: any) => {
const filteredRow: any = {};
columns.forEach((col) => {
if (row.hasOwnProperty(col)) {
@@ -1039,7 +1044,16 @@ export class BatchExternalDbService {
);
console.log(`[BatchExternalDbService] 전송할 데이터:`, requestData);
await connector.executeQuery(finalEndpoint, method, requestData);
// REST API는 executeRequest 사용
if ((connector as any).executeRequest) {
await (connector as any).executeRequest(
finalEndpoint,
method,
requestData
);
} else {
await connector.executeQuery(finalEndpoint);
}
successCount++;
} catch (error) {
console.error(`REST API 레코드 전송 실패:`, error);
@@ -1104,7 +1118,12 @@ export class BatchExternalDbService {
);
console.log(`[BatchExternalDbService] 전송할 데이터:`, record);
await connector.executeQuery(endpoint, method, record);
// REST API는 executeRequest 사용
if ((connector as any).executeRequest) {
await (connector as any).executeRequest(endpoint, method, record);
} else {
await connector.executeQuery(endpoint);
}
successCount++;
} catch (error) {
console.error(`REST API 레코드 전송 실패:`, error);

View File

@@ -1205,4 +1205,157 @@ export class ExternalDbConnectionService {
};
}
}
/**
* 특정 외부 DB 연결의 테이블 목록 조회
*/
static async getTablesFromConnection(
connectionId: number
): Promise<ApiResponse<TableInfo[]>> {
try {
// 연결 정보 조회
const connection = await queryOne<any>(
`SELECT * FROM external_db_connections WHERE id = $1`,
[connectionId]
);
if (!connection) {
return {
success: false,
message: `연결 ID ${connectionId}를 찾을 수 없습니다.`,
};
}
// 비밀번호 복호화
const password = connection.password
? PasswordEncryption.decrypt(connection.password)
: "";
// 연결 설정 준비
const config = {
host: connection.host,
port: connection.port,
database: connection.database_name,
user: connection.username,
password: password,
connectionTimeoutMillis:
connection.connection_timeout != null
? connection.connection_timeout * 1000
: undefined,
queryTimeoutMillis:
connection.query_timeout != null
? connection.query_timeout * 1000
: undefined,
ssl:
connection.ssl_enabled === "Y"
? { rejectUnauthorized: false }
: false,
};
// 커넥터 생성
const connector = await DatabaseConnectorFactory.createConnector(
connection.db_type,
config,
connectionId
);
try {
const tables = await connector.getTables();
return {
success: true,
data: tables,
message: `${tables.length}개의 테이블을 조회했습니다.`,
};
} finally {
await DatabaseConnectorFactory.closeConnector(
connectionId,
connection.db_type
);
}
} catch (error) {
logger.error("테이블 목록 조회 실패:", error);
return {
success: false,
message: "테이블 목록 조회 중 오류가 발생했습니다.",
error: error instanceof Error ? error.message : "알 수 없는 오류",
};
}
}
/**
* 특정 외부 DB 테이블의 컬럼 목록 조회
*/
static async getColumnsFromConnection(
connectionId: number,
tableName: string
): Promise<ApiResponse<any[]>> {
try {
// 연결 정보 조회
const connection = await queryOne<any>(
`SELECT * FROM external_db_connections WHERE id = $1`,
[connectionId]
);
if (!connection) {
return {
success: false,
message: `연결 ID ${connectionId}를 찾을 수 없습니다.`,
};
}
// 비밀번호 복호화
const password = connection.password
? PasswordEncryption.decrypt(connection.password)
: "";
// 연결 설정 준비
const config = {
host: connection.host,
port: connection.port,
database: connection.database_name,
user: connection.username,
password: password,
connectionTimeoutMillis:
connection.connection_timeout != null
? connection.connection_timeout * 1000
: undefined,
queryTimeoutMillis:
connection.query_timeout != null
? connection.query_timeout * 1000
: undefined,
ssl:
connection.ssl_enabled === "Y"
? { rejectUnauthorized: false }
: false,
};
// 커넥터 생성
const connector = await DatabaseConnectorFactory.createConnector(
connection.db_type,
config,
connectionId
);
try {
const columns = await connector.getColumns(tableName);
return {
success: true,
data: columns,
message: `${columns.length}개의 컬럼을 조회했습니다.`,
};
} finally {
await DatabaseConnectorFactory.closeConnector(
connectionId,
connection.db_type
);
}
} catch (error) {
logger.error("컬럼 목록 조회 실패:", error);
return {
success: false,
message: "컬럼 목록 조회 중 오류가 발생했습니다.",
error: error instanceof Error ? error.message : "알 수 없는 오류",
};
}
}
}

File diff suppressed because it is too large Load Diff