diff options
| author | joonhoekim <26rote@gmail.com> | 2025-12-08 14:19:37 +0900 |
|---|---|---|
| committer | joonhoekim <26rote@gmail.com> | 2025-12-08 14:19:37 +0900 |
| commit | 2ac7deb8494cf4123f0cff3321860585a44f157c (patch) | |
| tree | 789b6980c8f863a0f675fad38c4a17d91ba28bf3 /app/api | |
| parent | 71c0ba1f01b98770ec2c60cdb935ffb36c1830a9 (diff) | |
| parent | e37cce51ccfa3dcb91904b2492df3a29970fadf7 (diff) | |
Merge remote-tracking branch 'origin/sec-patch' into table-v2
Diffstat (limited to 'app/api')
| -rw-r--r-- | app/api/cron/tags-plant/start/route.ts | 38 | ||||
| -rw-r--r-- | app/api/general-contracts/upload-pdf/route.ts | 73 |
2 files changed, 99 insertions, 12 deletions
diff --git a/app/api/cron/tags-plant/start/route.ts b/app/api/cron/tags-plant/start/route.ts index 83e06935..17a96ed7 100644 --- a/app/api/cron/tags-plant/start/route.ts +++ b/app/api/cron/tags-plant/start/route.ts @@ -88,8 +88,6 @@ async function processTagImport(syncId: string) { const jobInfo = syncJobs.get(syncId)!; const projectCode = jobInfo.projectCode; const packageCode = jobInfo.packageCode; - const mode = jobInfo.mode; // 모드 정보 추출 - // 상태 업데이트: 처리 중 syncJobs.set(syncId, { @@ -102,23 +100,40 @@ async function processTagImport(syncId: string) { throw new Error('Package is required'); } - // 여기서 실제 태그 가져오기 로직 import const { importTagsFromSEDP } = await import('@/lib/sedp/get-tags-plant'); - // 진행 상황 업데이트를 위한 콜백 함수 - const updateProgress = (progress: number) => { + // ENG 모드 실행 (0~50%) + const updateProgressENG = (progress: number) => { + syncJobs.set(syncId, { + ...syncJobs.get(syncId)!, + progress: Math.floor(progress * 0.5) + }); + }; + + const engResult = await importTagsFromSEDP(projectCode, packageCode, updateProgressENG, 'ENG'); + + // IM 모드 실행 (50~100%) + const updateProgressIM = (progress: number) => { syncJobs.set(syncId, { ...syncJobs.get(syncId)!, - progress + progress: 50 + Math.floor(progress * 0.5) }); }; - // 실제 태그 가져오기 실행 - const result = await importTagsFromSEDP(projectCode, packageCode,updateProgress, mode); + const imResult = await importTagsFromSEDP(projectCode, packageCode, updateProgressIM, 'IM'); - // 명시적으로 캐시 무효화 + // 캐시 무효화 revalidateTag(`tags-${packageCode}`); - revalidateTag(`forms-${packageCode}-${mode}`); + revalidateTag(`forms-${packageCode}-ENG`); + revalidateTag(`forms-${packageCode}-IM`); + + // 결과 합산 + const result = { + processedCount: engResult.processedCount + imResult.processedCount, + excludedCount: engResult.excludedCount + imResult.excludedCount, + totalEntries: engResult.totalEntries + imResult.totalEntries, + errors: [...(engResult.errors || []), ...(imResult.errors || [])].filter(Boolean) + }; // 상태 업데이트: 완료 syncJobs.set(syncId, { @@ -131,7 +146,6 @@ async function processTagImport(syncId: string) { return result; } catch (error: any) { - // 에러 발생 시 상태 업데이트 syncJobs.set(syncId, { ...syncJobs.get(syncId)!, status: 'failed', @@ -139,7 +153,7 @@ async function processTagImport(syncId: string) { error: error.message || 'Unknown error occurred', }); - throw error; // 에러 다시 던지기 + throw error; } } diff --git a/app/api/general-contracts/upload-pdf/route.ts b/app/api/general-contracts/upload-pdf/route.ts new file mode 100644 index 00000000..9480f7f5 --- /dev/null +++ b/app/api/general-contracts/upload-pdf/route.ts @@ -0,0 +1,73 @@ +/** + * 일반계약 PDF 업로드 API + * 클라이언트에서 생성된 PDF를 서버에 저장 + */ + +import { NextRequest, NextResponse } from 'next/server'; +import { getServerSession } from 'next-auth/next'; +import { authOptions } from '@/app/api/auth/[...nextauth]/route'; +import { saveBuffer } from '@/lib/file-stroage'; + +export async function POST(request: NextRequest) { + try { + const session = await getServerSession(authOptions); + if (!session?.user?.id) { + return NextResponse.json( + { success: false, error: '인증이 필요합니다' }, + { status: 401 } + ); + } + + const formData = await request.formData(); + const file = formData.get('file') as File; + const contractId = formData.get('contractId') as string; + + if (!file) { + return NextResponse.json( + { success: false, error: '파일이 제공되지 않았습니다' }, + { status: 400 } + ); + } + + // 파일을 ArrayBuffer로 읽기 + const arrayBuffer = await file.arrayBuffer(); + const buffer = Buffer.from(arrayBuffer); + + // saveBuffer 함수를 사용해서 파일 저장 + const saveResult = await saveBuffer({ + buffer: buffer, + fileName: `${Date.now()}_${file.name}`, + directory: "generalContracts", + originalName: file.name, + userId: session.user.id + }); + + if (!saveResult.success) { + return NextResponse.json( + { success: false, error: saveResult.error || 'PDF 파일 저장에 실패했습니다.' }, + { status: 500 } + ); + } + + const finalFilePath = saveResult.publicPath + ? saveResult.publicPath.replace('/api/files/', '') + : `/generalContracts/${saveResult.fileName}`; + + return NextResponse.json({ + success: true, + filePath: finalFilePath, + fileName: saveResult.fileName, + publicPath: saveResult.publicPath, + }); + } catch (error) { + console.error('PDF 업로드 오류:', error); + return NextResponse.json( + { + success: false, + error: error instanceof Error ? error.message : 'PDF 업로드 중 오류가 발생했습니다.' + }, + { status: 500 } + ); + } +} + |
