diff options
Diffstat (limited to 'lib/vendors/service.ts')
| -rw-r--r-- | lib/vendors/service.ts | 111 |
1 files changed, 108 insertions, 3 deletions
diff --git a/lib/vendors/service.ts b/lib/vendors/service.ts index 2a927069..9af81021 100644 --- a/lib/vendors/service.ts +++ b/lib/vendors/service.ts @@ -9,6 +9,8 @@ import crypto from 'crypto'; import fs from 'fs/promises'; import path from 'path'; import { v4 as uuidv4 } from 'uuid'; +import { saveDRMFile } from "@/lib/file-stroage"; +import { decryptWithServerAction } from "@/components/drm/drmUtils"; import { filterColumns } from "@/lib/filter-columns"; import { unstable_cache } from "@/lib/unstable-cache"; @@ -2002,6 +2004,7 @@ export async function getVendorDetailById(id: number) { if (!vendor) { return null; } + console.log("vendor", vendor.attachments) // JSON 문자열로 반환된 contacts와 attachments를 JavaScript 객체로 파싱 const contacts = typeof vendor.contacts === 'string' @@ -2059,8 +2062,10 @@ export async function updateVendorInfo(params: { files?: File[] creditRatingFiles?: File[] cashFlowRatingFiles?: File[] + signatureFiles?: File[] // 서명/직인 파일들 contacts: ContactInfo[] filesToDelete?: number[] // 삭제할 파일 ID 목록 + selectedAttachmentType?: string // 선택된 첨부파일 타입 }) { try { const { @@ -2068,8 +2073,10 @@ export async function updateVendorInfo(params: { files = [], creditRatingFiles = [], cashFlowRatingFiles = [], + signatureFiles = [], contacts, - filesToDelete = [] + filesToDelete = [], + selectedAttachmentType = "GENERAL" } = params // 세션 및 권한 확인 @@ -2204,9 +2211,9 @@ export async function updateVendorInfo(params: { } // 4. 새 파일 저장 (제공된 storeVendorFiles 함수 활용) - // 4-1. 일반 파일 저장 + // 4-1. 일반 파일 저장 (선택된 타입 사용) if (files.length > 0) { - await storeVendorFiles(tx, vendorData.id, files, "GENERAL"); + await storeVendorFiles(tx, vendorData.id, files, selectedAttachmentType); } // 4-2. 신용평가 파일 저장 @@ -2218,6 +2225,11 @@ export async function updateVendorInfo(params: { if (cashFlowRatingFiles.length > 0) { await storeVendorFiles(tx, vendorData.id, cashFlowRatingFiles, "CASH_FLOW_RATING"); } + + // 4-4. 서명/직인 파일 저장 + if (signatureFiles.length > 0) { + await storeVendorFiles(tx, vendorData.id, signatureFiles, "SIGNATURE"); + } }) // 캐시 무효화 @@ -2989,3 +3001,96 @@ export async function requestBasicContractInfo({ }; } } + +/** + * 비밀유지 계약서 첨부파일 저장 서버 액션 + */ +export async function saveNdaAttachments(input: { + vendorIds: number[]; + files: File[]; + userId: string; +}) { + unstable_noStore(); + + try { + console.log("📎 비밀유지 계약서 첨부파일 저장 시작"); + console.log(`벤더 수: ${input.vendorIds.length}, 파일 수: ${input.files.length}`); + + const results = []; + + for (const vendorId of input.vendorIds) { + for (const file of input.files) { + console.log(`📄 처리 중: 벤더 ID ${vendorId} - ${file.name}`); + + try { + // saveDRMFile을 사용해서 파일 저장 + const saveResult = await saveDRMFile( + file, + decryptWithServerAction, + `vendor-attachments/nda/${vendorId}`, + input.userId + ); + + if (!saveResult.success) { + throw new Error(`파일 저장 실패: ${file.name} - ${saveResult.error}`); + } + + // vendor_attachments 테이블에 파일 정보 저장 + const insertedAttachment = await db.insert(vendorAttachments).values({ + vendorId: vendorId, + fileType: file.type || 'application/octet-stream', + fileName: saveResult.fileName || file.name, + filePath: saveResult.publicPath || '', + attachmentType: 'NDA_ATTACHMENT', + }).returning(); + + results.push({ + vendorId, + fileName: file.name, + attachmentId: insertedAttachment[0]?.id || 0, + success: true + }); + + console.log(`✅ 완료: 벤더 ID ${vendorId} - ${file.name}`); + + } catch (error) { + console.error(`❌ 실패: 벤더 ID ${vendorId} - ${file.name}`, error); + results.push({ + vendorId, + fileName: file.name, + success: false, + error: error instanceof Error ? error.message : '알 수 없는 오류' + }); + } + } + } + + // 성공/실패 카운트 + const successCount = results.filter(r => r.success).length; + const failureCount = results.filter(r => !r.success).length; + + console.log(`📊 처리 결과: 성공 ${successCount}개, 실패 ${failureCount}개`); + + // 캐시 무효화 + revalidateTag("vendor-attachments"); + + return { + success: true, + results, + summary: { + total: results.length, + success: successCount, + failure: failureCount + } + }; + + } catch (error) { + console.error("비밀유지 계약서 첨부파일 저장 중 오류 발생:", error); + return { + success: false, + error: error instanceof Error + ? error.message + : "첨부파일 저장 처리 중 오류가 발생했습니다." + }; + } +} |
