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