138 lines
4.2 KiB
TypeScript
138 lines
4.2 KiB
TypeScript
import { Request, Response } from "express";
|
|
import { AuthenticatedRequest } from "../middleware/authMiddleware";
|
|
import { query } from "../database/db";
|
|
import logger from "../utils/logger";
|
|
|
|
/**
|
|
* 화면 컴포넌트별 파일 정보 조회 및 복원
|
|
*/
|
|
export const getScreenComponentFiles = async (
|
|
req: AuthenticatedRequest,
|
|
res: Response
|
|
): Promise<void> => {
|
|
try {
|
|
const { screenId } = req.params;
|
|
|
|
logger.info(`화면 컴포넌트 파일 조회 시작: screenId=${screenId}`);
|
|
|
|
// screen_files: 접두사로 해당 화면의 모든 파일 조회
|
|
const targetObjidPattern = `screen_files:${screenId}:%`;
|
|
|
|
const files = await query<any>(
|
|
`SELECT * FROM attach_file_info
|
|
WHERE target_objid LIKE $1
|
|
AND status = 'ACTIVE'
|
|
ORDER BY regdate DESC`,
|
|
[`screen_files:${screenId}:%`]
|
|
);
|
|
|
|
// 컴포넌트별로 파일 그룹화
|
|
const componentFiles: { [componentId: string]: any[] } = {};
|
|
|
|
files.forEach((file) => {
|
|
// target_objid 형식: screen_files:screenId:componentId:fieldName
|
|
const targetParts = file.target_objid?.split(":") || [];
|
|
if (targetParts.length >= 3) {
|
|
const componentId = targetParts[2];
|
|
|
|
if (!componentFiles[componentId]) {
|
|
componentFiles[componentId] = [];
|
|
}
|
|
|
|
componentFiles[componentId].push({
|
|
objid: file.objid.toString(),
|
|
savedFileName: file.saved_file_name,
|
|
realFileName: file.real_file_name,
|
|
fileSize: Number(file.file_size),
|
|
fileExt: file.file_ext,
|
|
filePath: file.file_path,
|
|
docType: file.doc_type,
|
|
docTypeName: file.doc_type_name,
|
|
targetObjid: file.target_objid,
|
|
parentTargetObjid: file.parent_target_objid,
|
|
writer: file.writer,
|
|
regdate: file.regdate?.toISOString(),
|
|
status: file.status,
|
|
});
|
|
}
|
|
});
|
|
|
|
logger.info(
|
|
`화면 컴포넌트 파일 조회 완료: ${Object.keys(componentFiles).length}개 컴포넌트, 총 ${files.length}개 파일`
|
|
);
|
|
|
|
res.json({
|
|
success: true,
|
|
componentFiles: componentFiles,
|
|
totalFiles: files.length,
|
|
componentCount: Object.keys(componentFiles).length,
|
|
});
|
|
} catch (error) {
|
|
logger.error("화면 컴포넌트 파일 조회 오류:", error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: "화면 컴포넌트 파일 조회 중 오류가 발생했습니다.",
|
|
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
|
});
|
|
}
|
|
};
|
|
|
|
/**
|
|
* 특정 컴포넌트의 파일 목록 조회
|
|
*/
|
|
export const getComponentFiles = async (
|
|
req: AuthenticatedRequest,
|
|
res: Response
|
|
): Promise<void> => {
|
|
try {
|
|
const { screenId, componentId } = req.params;
|
|
|
|
logger.info(
|
|
`컴포넌트 파일 조회: screenId=${screenId}, componentId=${componentId}`
|
|
);
|
|
|
|
// target_objid 패턴: screen_files:screenId:componentId:*
|
|
const targetObjidPattern = `screen_files:${screenId}:${componentId}:`;
|
|
|
|
const files = await query<any>(
|
|
`SELECT * FROM attach_file_info
|
|
WHERE target_objid LIKE $1
|
|
AND status = 'ACTIVE'
|
|
ORDER BY regdate DESC`,
|
|
[`${targetObjidPattern}%`]
|
|
);
|
|
|
|
const fileList = files.map((file) => ({
|
|
objid: file.objid.toString(),
|
|
savedFileName: file.saved_file_name,
|
|
realFileName: file.real_file_name,
|
|
fileSize: Number(file.file_size),
|
|
fileExt: file.file_ext,
|
|
filePath: file.file_path,
|
|
docType: file.doc_type,
|
|
docTypeName: file.doc_type_name,
|
|
targetObjid: file.target_objid,
|
|
parentTargetObjid: file.parent_target_objid,
|
|
writer: file.writer,
|
|
regdate: file.regdate?.toISOString(),
|
|
status: file.status,
|
|
}));
|
|
|
|
logger.info(`컴포넌트 파일 조회 완료: ${fileList.length}개 파일`);
|
|
|
|
res.json({
|
|
success: true,
|
|
files: fileList,
|
|
componentId: componentId,
|
|
screenId: screenId,
|
|
});
|
|
} catch (error) {
|
|
logger.error("컴포넌트 파일 조회 오류:", error);
|
|
res.status(500).json({
|
|
success: false,
|
|
message: "컴포넌트 파일 조회 중 오류가 발생했습니다.",
|
|
error: error instanceof Error ? error.message : "알 수 없는 오류",
|
|
});
|
|
}
|
|
};
|