From 2acf5f8966a40c1c9a97680c8dc263ee3f1ad3d1 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Wed, 2 Jul 2025 00:45:49 +0000 Subject: (대표님/최겸) 20250702 변경사항 업데이트 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/richtext/route.ts | 54 ++++++++++++++++++++++++ app/api/vendor-responses/update-comment/route.ts | 2 + app/api/vendor-responses/update/route.ts | 1 + 3 files changed, 57 insertions(+) create mode 100644 app/api/richtext/route.ts (limited to 'app/api') diff --git a/app/api/richtext/route.ts b/app/api/richtext/route.ts new file mode 100644 index 00000000..3d050dc5 --- /dev/null +++ b/app/api/richtext/route.ts @@ -0,0 +1,54 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { writeFile, mkdir } from 'fs/promises'; +import { join } from 'path'; +import { randomUUID } from 'crypto'; + +export async function POST(req: NextRequest) { + try { + const formData = await req.formData(); + const file = formData.get('file') as File; + + console.log(file) + + if (!file) { + return NextResponse.json({ error: '파일이 없습니다.' }, { status: 400 }); + } + + // 파일 확장자 검증 + const allowedTypes = ['image/jpeg', 'image/png', 'image/webp', 'image/gif']; + if (!allowedTypes.includes(file.type)) { + return NextResponse.json({ error: '지원하지 않는 파일 형식입니다.' }, { status: 400 }); + } + + // 파일 크기 제한 (5MB) + if (file.size > 5 * 1024 * 1024) { + return NextResponse.json({ error: '파일 크기는 5MB 이하여야 합니다.' }, { status: 400 }); + } + + // 업로드 디렉토리 생성 + const uploadDir = join(process.cwd(), 'public', 'uploads', 'richtext'); + await mkdir(uploadDir, { recursive: true }); + + // 고유한 파일명 생성 + const fileExtension = file.name.split('.').pop(); + const fileName = `${randomUUID()}.${fileExtension}`; + const filePath = join(uploadDir, fileName); + + // 파일 저장 + const arrayBuffer = await file.arrayBuffer(); + await writeFile(filePath, new Uint8Array(arrayBuffer)); + + // 공개 URL 반환 + const fileUrl = `/uploads/richtext/${fileName}`; + + return NextResponse.json({ + success: true, + url: fileUrl, + message: '이미지가 성공적으로 업로드되었습니다.' + }); + + } catch (error) { + console.error('파일 업로드 실패:', error); + return NextResponse.json({ error: '파일 업로드에 실패했습니다.' }, { status: 500 }); + } +} \ No newline at end of file diff --git a/app/api/vendor-responses/update-comment/route.ts b/app/api/vendor-responses/update-comment/route.ts index 212173d7..f1e4c487 100644 --- a/app/api/vendor-responses/update-comment/route.ts +++ b/app/api/vendor-responses/update-comment/route.ts @@ -5,6 +5,7 @@ import { vendorAttachmentResponses } from "@/db/schema"; import { getServerSession } from "next-auth/next" import { authOptions } from "@/app/api/auth/[...nextauth]/route" +import { eq } from "drizzle-orm"; export async function POST(request: NextRequest) { try { @@ -34,6 +35,7 @@ export async function POST(request: NextRequest) { responseComment, vendorComment, updatedAt: new Date(), + updatedBy:Number(session?.user.id) }) .where(eq(vendorAttachmentResponses.id, parseInt(responseId))) .returning(); diff --git a/app/api/vendor-responses/update/route.ts b/app/api/vendor-responses/update/route.ts index 8771b062..5ee31d4d 100644 --- a/app/api/vendor-responses/update/route.ts +++ b/app/api/vendor-responses/update/route.ts @@ -94,6 +94,7 @@ export async function POST(request: NextRequest) { vendorComment, respondedAt: respondedAt ? new Date(respondedAt) : null, updatedAt: new Date(), + updatedBy:Number(session?.user.id) }) .where(eq(vendorAttachmentResponses.id, parseInt(responseId))) .returning(); -- cgit v1.2.3