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 => { try { const { screenId } = req.params; logger.info(`화면 컴포넌트 파일 조회 시작: screenId=${screenId}`); // screen_files: 접두사로 해당 화면의 모든 파일 조회 const targetObjidPattern = `screen_files:${screenId}:%`; const files = await query( `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 => { 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( `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 : "알 수 없는 오류", }); } };