ERP-node/frontend/lib/api/tableManagement.ts

332 lines
10 KiB
TypeScript
Raw Normal View History

/**
* API
*
*/
import { apiClient, ApiResponse } from "./client";
// 컬럼 정보 타입 (백엔드와 일치)
export interface ColumnTypeInfo {
tableName?: string;
columnName: string;
displayName: string;
dataType: string;
dbType: string;
webType: string;
inputType?: "direct" | "auto";
detailSettings: string;
description?: string;
isNullable: string;
isPrimaryKey: boolean;
defaultValue?: string;
maxLength?: number;
numericPrecision?: number;
numericScale?: number;
codeCategory?: string;
codeValue?: string;
referenceTable?: string;
referenceColumn?: string;
displayColumn?: string;
displayOrder?: number;
isVisible?: boolean;
}
// 테이블 정보 타입
export interface TableInfo {
tableName: string;
displayName: string;
description: string;
columnCount: number;
}
// 컬럼 설정 타입
export interface ColumnSettings {
columnName?: string;
columnLabel: string;
webType: string;
detailSettings: string;
codeCategory: string;
codeValue: string;
referenceTable: string;
referenceColumn: string;
displayColumn?: string;
displayOrder?: number;
isVisible?: boolean;
}
// API 응답 타입들
export interface TableListResponse extends ApiResponse<TableInfo[]> {}
export interface ColumnListResponse extends ApiResponse<ColumnTypeInfo[]> {}
export interface ColumnSettingsResponse extends ApiResponse<void> {}
/**
* API
*/
class TableManagementApi {
private readonly basePath = "/table-management";
/**
*
*/
async getTableList(): Promise<TableListResponse> {
try {
const response = await apiClient.get(`${this.basePath}/tables`);
return response.data;
} catch (error: any) {
console.error("❌ 테이블 목록 조회 실패:", error);
return {
success: false,
message: error.response?.data?.message || error.message || "테이블 목록을 조회할 수 없습니다.",
errorCode: error.response?.data?.errorCode,
};
}
}
/**
*
*/
async getColumnList(tableName: string, size: number = 1000): Promise<ColumnListResponse> {
try {
const response = await apiClient.get(`${this.basePath}/tables/${tableName}/columns?size=${size}`);
return response.data;
} catch (error: any) {
console.error(`❌ 테이블 '${tableName}' 컬럼 목록 조회 실패:`, error);
return {
success: false,
message:
error.response?.data?.message || error.message || `테이블 '${tableName}'의 컬럼 정보를 조회할 수 없습니다.`,
errorCode: error.response?.data?.errorCode,
};
}
}
/**
*
*/
async updateColumnSettings(
tableName: string,
columnName: string,
settings: ColumnSettings,
): Promise<ColumnSettingsResponse> {
try {
const response = await apiClient.put(`${this.basePath}/tables/${tableName}/columns/${columnName}`, settings);
return response.data;
} catch (error: any) {
console.error(`❌ 컬럼 '${tableName}.${columnName}' 설정 저장 실패:`, error);
return {
success: false,
message: error.response?.data?.message || error.message || "컬럼 설정을 저장할 수 없습니다.",
errorCode: error.response?.data?.errorCode,
};
}
}
/**
*
*/
async updateMultipleColumnSettings(
tableName: string,
settingsArray: Array<{ columnName: string; settings: ColumnSettings }>,
): Promise<ColumnSettingsResponse> {
try {
const response = await apiClient.put(`${this.basePath}/tables/${tableName}/columns/batch`, {
settings: settingsArray,
});
return response.data;
} catch (error: any) {
console.error(`❌ 테이블 '${tableName}' 컬럼 설정 일괄 저장 실패:`, error);
return {
success: false,
message: error.response?.data?.message || error.message || "컬럼 설정을 일괄 저장할 수 없습니다.",
errorCode: error.response?.data?.errorCode,
};
}
}
/**
* ( )
*/
async getTableSchema(tableName: string): Promise<ApiResponse<ColumnTypeInfo[]>> {
try {
const response = await apiClient.get(`${this.basePath}/tables/${tableName}/schema`);
return response.data;
} catch (error: any) {
console.error(`❌ 테이블 '${tableName}' 스키마 조회 실패:`, error);
return {
success: false,
message:
error.response?.data?.message || error.message || `테이블 '${tableName}'의 스키마 정보를 조회할 수 없습니다.`,
errorCode: error.response?.data?.errorCode,
};
}
}
/**
*
*/
async checkTableExists(tableName: string): Promise<ApiResponse<{ exists: boolean }>> {
try {
const response = await apiClient.get(`${this.basePath}/tables/${tableName}/exists`);
return response.data;
} catch (error: any) {
console.error(`❌ 테이블 '${tableName}' 존재 여부 확인 실패:`, error);
return {
success: false,
message: error.response?.data?.message || error.message || "테이블 존재 여부를 확인할 수 없습니다.",
errorCode: error.response?.data?.errorCode,
};
}
}
/**
* ( )
*/
async getColumnWebTypes(tableName: string): Promise<ApiResponse<ColumnTypeInfo[]>> {
try {
const response = await apiClient.get(`${this.basePath}/tables/${tableName}/web-types`);
return response.data;
} catch (error: any) {
console.error(`❌ 테이블 '${tableName}' 웹타입 정보 조회 실패:`, error);
return {
success: false,
message: error.response?.data?.message || error.message || "웹타입 정보를 조회할 수 없습니다.",
errorCode: error.response?.data?.errorCode,
};
}
}
/**
*
*/
async checkDatabaseConnection(): Promise<ApiResponse<{ connected: boolean; message: string }>> {
try {
const response = await apiClient.get(`${this.basePath}/health`);
return response.data;
} catch (error: any) {
console.error("❌ 데이터베이스 연결 상태 확인 실패:", error);
return {
success: false,
message: error.response?.data?.message || error.message || "데이터베이스 연결 상태를 확인할 수 없습니다.",
errorCode: error.response?.data?.errorCode,
};
}
}
// ========================================
// 테이블 로그 시스템 API
// ========================================
/**
*
*/
async createLogTable(
tableName: string,
pkColumn: { columnName: string; dataType: string },
): Promise<ApiResponse<void>> {
try {
const response = await apiClient.post(`${this.basePath}/tables/${tableName}/log`, { pkColumn });
return response.data;
} catch (error: any) {
console.error(`❌ 로그 테이블 생성 실패: ${tableName}`, error);
return {
success: false,
message: error.response?.data?.message || error.message || "로그 테이블을 생성할 수 없습니다.",
errorCode: error.response?.data?.errorCode,
};
}
}
/**
*
*/
async getLogConfig(tableName: string): Promise<
ApiResponse<{
originalTableName: string;
logTableName: string;
triggerName: string;
triggerFunctionName: string;
isActive: string;
createdAt: Date;
createdBy: string;
} | null>
> {
try {
const response = await apiClient.get(`${this.basePath}/tables/${tableName}/log/config`);
return response.data;
} catch (error: any) {
console.error(`❌ 로그 설정 조회 실패: ${tableName}`, error);
return {
success: false,
message: error.response?.data?.message || error.message || "로그 설정을 조회할 수 없습니다.",
errorCode: error.response?.data?.errorCode,
};
}
}
/**
*
*/
async getLogData(
tableName: string,
options: {
page?: number;
size?: number;
operationType?: string;
startDate?: string;
endDate?: string;
changedBy?: string;
originalId?: string;
} = {},
): Promise<
ApiResponse<{
data: any[];
total: number;
page: number;
size: number;
totalPages: number;
}>
> {
try {
const response = await apiClient.get(`${this.basePath}/tables/${tableName}/log`, {
params: options,
});
return response.data;
} catch (error: any) {
console.error(`❌ 로그 데이터 조회 실패: ${tableName}`, error);
return {
success: false,
message: error.response?.data?.message || error.message || "로그 데이터를 조회할 수 없습니다.",
errorCode: error.response?.data?.errorCode,
};
}
}
/**
* /
*/
async toggleLogTable(tableName: string, isActive: boolean): Promise<ApiResponse<void>> {
try {
const response = await apiClient.post(`${this.basePath}/tables/${tableName}/log/toggle`, {
isActive,
});
return response.data;
} catch (error: any) {
console.error(`❌ 로그 테이블 토글 실패: ${tableName}`, error);
return {
success: false,
message: error.response?.data?.message || error.message || "로그 테이블 설정을 변경할 수 없습니다.",
errorCode: error.response?.data?.errorCode,
};
}
}
}
// 싱글톤 인스턴스 생성
export const tableManagementApi = new TableManagementApi();
// 편의 함수들
export const getTableColumns = (tableName: string) => tableManagementApi.getColumnList(tableName);
export const updateColumnType = (tableName: string, columnName: string, settings: ColumnSettings) =>
tableManagementApi.updateColumnSettings(tableName, columnName, settings);
export const checkTableExists = (tableName: string) => tableManagementApi.checkTableExists(tableName);