// app/api/vendor-responses/update/route.ts import { NextRequest, NextResponse } from "next/server"; import db from "@/db/db"; import { vendorAttachmentResponses } from "@/db/schema"; import { eq } from "drizzle-orm"; import { getServerSession } from "next-auth/next" import { authOptions } from "@/app/api/auth/[...nextauth]/route" // 리비전 번호를 증가시키는 헬퍼 함수 function getNextRevision(currentRevision?: string): string { if (!currentRevision) { return "Rev.0"; // 첫 번째 응답 } // "Rev.1" -> 1, "Rev.2" -> 2 형태로 숫자 추출 const match = currentRevision.match(/Rev\.(\d+)/); if (match) { const currentNumber = parseInt(match[1]); return `Rev.${currentNumber + 1}`; } // 형식이 다르면 기본값 반환 return "Rev.0"; } export async function POST(request: NextRequest) { try { // 인증 확인 const session = await getServerSession(authOptions); if (!session?.user?.id) { return NextResponse.json( { message: "인증이 필요합니다." }, { status: 401 } ); } const body = await request.json(); const { responseId, responseStatus, responseComment, vendorComment, respondedAt, } = body; if (!responseId) { return NextResponse.json( { message: "응답 ID가 필요합니다." }, { status: 400 } ); } // 1. 기존 응답 정보 조회 (현재 respondedRevision 확인) const existingResponse = await db .select() .from(vendorAttachmentResponses) .where(eq(vendorAttachmentResponses.id, parseInt(responseId))) .limit(1); if (!existingResponse || existingResponse.length === 0) { return NextResponse.json( { message: "응답을 찾을 수 없습니다." }, { status: 404 } ); } const currentResponse = existingResponse[0]; // 2. 벤더 응답 리비전 결정 let nextRespondedRevision: string; if (responseStatus === "RESPONDED") { // 첫 응답이거나 수정 요청 후 재응답인 경우 리비전 증가 nextRespondedRevision = getNextRevision(currentResponse.respondedRevision); } else { // WAIVED 등 다른 상태는 기존 리비전 유지 nextRespondedRevision = currentResponse.respondedRevision || ""; } // 3. vendor response 업데이트 const [updatedResponse] = await db .update(vendorAttachmentResponses) .set({ responseStatus, respondedRevision: nextRespondedRevision, responseComment, vendorComment, respondedAt: respondedAt ? new Date(respondedAt) : null, updatedAt: new Date(), updatedBy:Number(session?.user.id) }) .where(eq(vendorAttachmentResponses.id, parseInt(responseId))) .returning(); if (!updatedResponse) { return NextResponse.json( { message: "응답 업데이트에 실패했습니다." }, { status: 500 } ); } return NextResponse.json({ message: "응답이 성공적으로 업데이트되었습니다.", response: updatedResponse, newRevision: nextRespondedRevision, // 새로운 리비전 정보 반환 }); } catch (error) { console.error("Response update error:", error); return NextResponse.json( { message: "응답 업데이트 중 오류가 발생했습니다." }, { status: 500 } ); } }