From 881ae9793b7c578ff88c1073619f49bd978a8293 Mon Sep 17 00:00:00 2001 From: kjs Date: Fri, 5 Sep 2025 15:13:21 +0900 Subject: [PATCH] =?UTF-8?q?401=EC=97=90=EB=9F=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend-node/src/routes/fileRoutes.ts | 46 ++++++++++++++++++--- backend-node/src/utils/fileSystemManager.ts | 46 +++++++++++++++++++++ 2 files changed, 87 insertions(+), 5 deletions(-) diff --git a/backend-node/src/routes/fileRoutes.ts b/backend-node/src/routes/fileRoutes.ts index dd7bcd97..b9f0f8f8 100644 --- a/backend-node/src/routes/fileRoutes.ts +++ b/backend-node/src/routes/fileRoutes.ts @@ -172,7 +172,20 @@ router.get( return; } - const filePath = path.join(UPLOAD_PATH, serverFilename as string); + // 회사별 폴더 구조를 고려하여 파일 경로 찾기 + const user = req.user; + const companyCode = user?.companyCode || "default"; + + // 먼저 회사별 폴더에서 찾기 + let filePath = FileSystemManager.findFileInCompanyFolders( + companyCode, + serverFilename as string + ); + + // 찾지 못하면 기본 uploads 폴더에서 찾기 (하위 호환성) + if (!filePath) { + filePath = path.join(UPLOAD_PATH, serverFilename as string); + } // 파일 존재 확인 if (!fs.existsSync(filePath)) { @@ -180,7 +193,8 @@ router.get( fileId, serverFilename, filePath, - userId: req.user?.userId, + companyCode, + userId: user?.userId, }); res.status(404).json({ @@ -257,15 +271,37 @@ router.delete( return; } - const filePath = path.join(UPLOAD_PATH, serverFilename); + // 회사별 폴더 구조를 고려하여 파일 경로 찾기 + const user = req.user; + const companyCode = user?.companyCode || "default"; - // 파일 존재 확인 + // 먼저 회사별 폴더에서 찾기 + let filePath = FileSystemManager.findFileInCompanyFolders( + companyCode, + serverFilename + ); + + // 찾지 못하면 기본 uploads 폴더에서 찾기 (하위 호환성) + if (!filePath) { + filePath = path.join(UPLOAD_PATH, serverFilename); + } + + // 파일 존재 확인 및 삭제 if (fs.existsSync(filePath)) { fs.unlinkSync(filePath); logger.info("파일 삭제 완료", { fileId, serverFilename, - userId: req.user?.userId, + filePath, + companyCode, + userId: user?.userId, + }); + } else { + logger.warn("삭제할 파일을 찾을 수 없음", { + fileId, + serverFilename, + companyCode, + userId: user?.userId, }); } diff --git a/backend-node/src/utils/fileSystemManager.ts b/backend-node/src/utils/fileSystemManager.ts index b0053656..a0b343d4 100644 --- a/backend-node/src/utils/fileSystemManager.ts +++ b/backend-node/src/utils/fileSystemManager.ts @@ -132,6 +132,52 @@ export class FileSystemManager { return sharedPath; } + /** + * 회사별 폴더 구조에서 파일 찾기 + * @param companyCode 회사 코드 + * @param serverFilename 서버 파일명 + * @returns 찾은 파일의 전체 경로 또는 null + */ + static findFileInCompanyFolders( + companyCode: string, + serverFilename: string + ): string | null { + try { + const companyBasePath = path.join( + this.BASE_UPLOAD_PATH, + `company_${companyCode}` + ); + + if (!fs.existsSync(companyBasePath)) { + return null; + } + + // 회사 폴더 내의 모든 하위 폴더를 재귀적으로 검색 + const findFileRecursively = (dirPath: string): string | null => { + const items = fs.readdirSync(dirPath); + + for (const item of items) { + const itemPath = path.join(dirPath, item); + const stats = fs.statSync(itemPath); + + if (stats.isFile() && item === serverFilename) { + return itemPath; + } else if (stats.isDirectory()) { + const found = findFileRecursively(itemPath); + if (found) return found; + } + } + + return null; + }; + + return findFileRecursively(companyBasePath); + } catch (error) { + logger.error(`파일 검색 실패: ${companyCode}/${serverFilename}`, error); + return null; + } + } + /** * 회사별 디스크 사용량 조회 * @param companyCode 회사 코드