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 => { 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 => { 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 : '알 수 없는 오류' }); } };