146 lines
4.3 KiB
TypeScript
146 lines
4.3 KiB
TypeScript
import { Request, Response } from 'express';
|
|
import { AuthenticatedRequest } from '../middleware/authMiddleware';
|
|
import { PrismaClient } from '@prisma/client';
|
|
import logger from '../utils/logger';
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
/**
|
|
* 화면 컴포넌트별 파일 정보 조회 및 복원
|
|
*/
|
|
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 prisma.attach_file_info.findMany({
|
|
where: {
|
|
target_objid: {
|
|
startsWith: `screen_files:${screenId}:`
|
|
},
|
|
status: 'ACTIVE'
|
|
},
|
|
orderBy: {
|
|
regdate: 'desc'
|
|
}
|
|
});
|
|
|
|
// 컴포넌트별로 파일 그룹화
|
|
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 prisma.attach_file_info.findMany({
|
|
where: {
|
|
target_objid: {
|
|
startsWith: targetObjidPattern
|
|
},
|
|
status: 'ACTIVE'
|
|
},
|
|
orderBy: {
|
|
regdate: 'desc'
|
|
}
|
|
});
|
|
|
|
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 : '알 수 없는 오류'
|
|
});
|
|
}
|
|
};
|