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 });
}
}
|