테이블 변경 이력 로그 시스템 구현

This commit is contained in:
dohyeons
2025-10-21 15:08:41 +09:00
parent 874cf485a8
commit 74d287daa9
8 changed files with 1918 additions and 6 deletions

View File

@@ -1048,3 +1048,268 @@ export async function updateColumnWebType(
res.status(500).json(response);
}
}
// ========================================
// 🎯 테이블 로그 시스템 API
// ========================================
/**
* 로그 테이블 생성
*/
export async function createLogTable(
req: AuthenticatedRequest,
res: Response
): Promise<void> {
try {
const { tableName } = req.params;
const { pkColumn } = req.body;
const userId = req.user?.userId;
logger.info(`=== 로그 테이블 생성 시작: ${tableName} ===`);
if (!tableName) {
const response: ApiResponse<null> = {
success: false,
message: "테이블명이 필요합니다.",
error: {
code: "MISSING_TABLE_NAME",
details: "테이블명 파라미터가 누락되었습니다.",
},
};
res.status(400).json(response);
return;
}
if (!pkColumn || !pkColumn.columnName || !pkColumn.dataType) {
const response: ApiResponse<null> = {
success: false,
message: "PK 컬럼 정보가 필요합니다.",
error: {
code: "MISSING_PK_COLUMN",
details: "PK 컬럼명과 데이터 타입이 필요합니다.",
},
};
res.status(400).json(response);
return;
}
const tableManagementService = new TableManagementService();
await tableManagementService.createLogTable(tableName, pkColumn, userId);
logger.info(`로그 테이블 생성 완료: ${tableName}_log`);
const response: ApiResponse<null> = {
success: true,
message: "로그 테이블이 성공적으로 생성되었습니다.",
};
res.status(200).json(response);
} catch (error) {
logger.error("로그 테이블 생성 중 오류 발생:", error);
const response: ApiResponse<null> = {
success: false,
message: "로그 테이블 생성 중 오류가 발생했습니다.",
error: {
code: "LOG_TABLE_CREATE_ERROR",
details: error instanceof Error ? error.message : "Unknown error",
},
};
res.status(500).json(response);
}
}
/**
* 로그 설정 조회
*/
export async function getLogConfig(
req: AuthenticatedRequest,
res: Response
): Promise<void> {
try {
const { tableName } = req.params;
logger.info(`=== 로그 설정 조회: ${tableName} ===`);
if (!tableName) {
const response: ApiResponse<null> = {
success: false,
message: "테이블명이 필요합니다.",
error: {
code: "MISSING_TABLE_NAME",
details: "테이블명 파라미터가 누락되었습니다.",
},
};
res.status(400).json(response);
return;
}
const tableManagementService = new TableManagementService();
const logConfig = await tableManagementService.getLogConfig(tableName);
const response: ApiResponse<typeof logConfig> = {
success: true,
message: "로그 설정을 조회했습니다.",
data: logConfig,
};
res.status(200).json(response);
} catch (error) {
logger.error("로그 설정 조회 중 오류 발생:", error);
const response: ApiResponse<null> = {
success: false,
message: "로그 설정 조회 중 오류가 발생했습니다.",
error: {
code: "LOG_CONFIG_ERROR",
details: error instanceof Error ? error.message : "Unknown error",
},
};
res.status(500).json(response);
}
}
/**
* 로그 데이터 조회
*/
export async function getLogData(
req: AuthenticatedRequest,
res: Response
): Promise<void> {
try {
const { tableName } = req.params;
const {
page = 1,
size = 20,
operationType,
startDate,
endDate,
changedBy,
originalId,
} = req.query;
logger.info(`=== 로그 데이터 조회: ${tableName} ===`);
if (!tableName) {
const response: ApiResponse<null> = {
success: false,
message: "테이블명이 필요합니다.",
error: {
code: "MISSING_TABLE_NAME",
details: "테이블명 파라미터가 누락되었습니다.",
},
};
res.status(400).json(response);
return;
}
const tableManagementService = new TableManagementService();
const result = await tableManagementService.getLogData(tableName, {
page: parseInt(page as string),
size: parseInt(size as string),
operationType: operationType as string,
startDate: startDate as string,
endDate: endDate as string,
changedBy: changedBy as string,
originalId: originalId as string,
});
logger.info(
`로그 데이터 조회 완료: ${tableName}_log, ${result.total}`
);
const response: ApiResponse<typeof result> = {
success: true,
message: "로그 데이터를 조회했습니다.",
data: result,
};
res.status(200).json(response);
} catch (error) {
logger.error("로그 데이터 조회 중 오류 발생:", error);
const response: ApiResponse<null> = {
success: false,
message: "로그 데이터 조회 중 오류가 발생했습니다.",
error: {
code: "LOG_DATA_ERROR",
details: error instanceof Error ? error.message : "Unknown error",
},
};
res.status(500).json(response);
}
}
/**
* 로그 테이블 활성화/비활성화
*/
export async function toggleLogTable(
req: AuthenticatedRequest,
res: Response
): Promise<void> {
try {
const { tableName } = req.params;
const { isActive } = req.body;
logger.info(`=== 로그 테이블 토글: ${tableName}, isActive: ${isActive} ===`);
if (!tableName) {
const response: ApiResponse<null> = {
success: false,
message: "테이블명이 필요합니다.",
error: {
code: "MISSING_TABLE_NAME",
details: "테이블명 파라미터가 누락되었습니다.",
},
};
res.status(400).json(response);
return;
}
if (isActive === undefined || isActive === null) {
const response: ApiResponse<null> = {
success: false,
message: "isActive 값이 필요합니다.",
error: {
code: "MISSING_IS_ACTIVE",
details: "isActive 파라미터가 누락되었습니다.",
},
};
res.status(400).json(response);
return;
}
const tableManagementService = new TableManagementService();
await tableManagementService.toggleLogTable(
tableName,
isActive === "Y" || isActive === true
);
logger.info(
`로그 테이블 토글 완료: ${tableName}, isActive: ${isActive}`
);
const response: ApiResponse<null> = {
success: true,
message: `로그 기능이 ${isActive ? "활성화" : "비활성화"}되었습니다.`,
};
res.status(200).json(response);
} catch (error) {
logger.error("로그 테이블 토글 중 오류 발생:", error);
const response: ApiResponse<null> = {
success: false,
message: "로그 테이블 토글 중 오류가 발생했습니다.",
error: {
code: "LOG_TOGGLE_ERROR",
details: error instanceof Error ? error.message : "Unknown error",
},
};
res.status(500).json(response);
}
}