summaryrefslogtreecommitdiff
path: root/app/api/upload/signed-contract/route.ts
blob: 8547f0e42813842672e32012c6e1ef32c04e17dc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// 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: new Date()
        })
        .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 });
  }
}