summaryrefslogtreecommitdiff
path: root/app/api/upload/signed-contract/route.ts
blob: 86109eecd74475261fbb0c6253a36c0472fef055 (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
// app/api/upload/signed-contract/route.ts
import { NextRequest, NextResponse } from 'next/server';
import fs from 'fs/promises';
import path from 'path';
import { v4 as uuidv4 } from 'uuid';
import db from "@/db/db";
import { basicContract } from '@/db/schema';
import { eq } from 'drizzle-orm';
import { revalidateTag } from 'next/cache';

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 originalName = `${tableRowId}_${templateName}`;
    const ext = path.extname(originalName);
    const uniqueName = uuidv4() + ext;
    
    const publicDir = path.join(process.cwd(), "public", "basicContract");
    const relativePath = `/basicContract/signed/${uniqueName}`;
    const absolutePath = path.join(publicDir, uniqueName);
    const buffer = Buffer.from(await file.arrayBuffer());
    
    await fs.mkdir(publicDir, { recursive: true });
    await fs.writeFile(absolutePath, buffer);
    
    await db.transaction(async (tx) => {
      await tx
        .update(basicContract)
        .set({
          status: "VENDOR_SIGNED",
          fileName: originalName,
          filePath: relativePath,
          updatedAt: new Date(),
          completedAt: new Date()
        })
        .where(eq(basicContract.id, tableRowId));
    });
    
    // 캐시 무효화
    revalidateTag("basic-contract-requests");
    revalidateTag("basicContractView-vendor");
    
    return NextResponse.json({ result: true });
  } catch (error) {
    console.error('서명된 계약서 저장 오류:', error);
    const errorMessage = error instanceof Error ? error.message : "알 수 없는 오류";
    return NextResponse.json({ result: false, error: errorMessage }, { status: 500 });
  }
}