// app/api/upload/signed-contract/route.ts import { NextRequest, NextResponse } from 'next/server'; import db from "@/db/db"; import { basicContract } from '@/db/schema'; import { eq } from 'drizzle-orm'; import { revalidateTag } from 'next/cache'; import { saveBuffer } from '@/lib/file-stroage'; export async function POST(request: NextRequest) { try { const formData = await request.formData(); const file = formData.get('file') as File; const tableRowId = parseInt(formData.get('tableRowId') as string); const templateName = formData.get('templateName') as string; if (!file || !tableRowId || !templateName) { return NextResponse.json({ result: false, error: '필수 파라미터가 누락되었습니다.' }, { status: 400 }); } // 원본 파일명 설정 const originalFileName = `${tableRowId}_${templateName}`; // 파일을 Buffer로 변환 const buffer = Buffer.from(await file.arrayBuffer()); // saveBuffer 함수를 사용하여 파일 저장 const saveResult = await saveBuffer({ buffer: buffer, fileName: file.name, // 실제 업로드된 파일명 directory: 'basicContract/signed', // 저장 디렉토리 originalName: originalFileName, // DB에 저장할 원본명 userId: undefined // 필요시 사용자 ID 추가 }); // 저장 실패 시 에러 반환 if (!saveResult.success) { return NextResponse.json({ result: false, error: saveResult.error || '파일 저장에 실패했습니다.' }, { status: 500 }); } // DB 업데이트 await db.transaction(async (tx) => { await tx .update(basicContract) .set({ status: "VENDOR_SIGNED", fileName: saveResult.originalName || originalFileName, // 원본 파일명 filePath: saveResult.publicPath, // 웹 접근 가능한 경로 updatedAt: new Date(), completedAt: null }) .where(eq(basicContract.id, tableRowId)); }); // 캐시 무효화 revalidateTag("basic-contract-requests"); revalidateTag("basicContractView-vendor"); return NextResponse.json({ result: true, filePath: saveResult.publicPath, fileName: saveResult.fileName }); } catch (error) { console.error('서명된 계약서 저장 오류:', error); const errorMessage = error instanceof Error ? error.message : "알 수 없는 오류"; return NextResponse.json({ result: false, error: errorMessage }, { status: 500 }); } }