From 2650b7c0bb0ea12b68a58c0439f72d61df04b2f1 Mon Sep 17 00:00:00 2001 From: dujinkim Date: Fri, 25 Jul 2025 07:51:15 +0000 Subject: (대표님) 정기평가 대상, 미들웨어 수정, nextauth 토큰 처리 개선, GTC 등 (최겸) 기술영업 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/basic-contract/service.ts | 16 +++++++----- .../add-basic-contract-template-dialog.tsx | 30 +++++++++++++++++----- lib/basic-contract/validations.ts | 4 +-- 3 files changed, 34 insertions(+), 16 deletions(-) (limited to 'lib/basic-contract') diff --git a/lib/basic-contract/service.ts b/lib/basic-contract/service.ts index 014f32ab..9b5505b5 100644 --- a/lib/basic-contract/service.ts +++ b/lib/basic-contract/service.ts @@ -189,12 +189,12 @@ export async function getBasicContractTemplates( // 템플릿 생성 (서버 액션) export async function createBasicContractTemplate(input: CreateBasicContractTemplateSchema) { unstable_noStore(); - + try { const newTemplate = await db.transaction(async (tx) => { const [row] = await insertBasicContractTemplate(tx, { templateName: input.templateName, - revision: 1, + revision: input.revision || 1, legalReviewRequired: input.legalReviewRequired, shipBuildingApplicable: input.shipBuildingApplicable, windApplicable: input.windApplicable, @@ -204,16 +204,18 @@ export async function createBasicContractTemplate(input: CreateBasicContractTemp gyApplicable: input.gyApplicable, sysApplicable: input.sysApplicable, infraApplicable: input.infraApplicable, - status: input.status, - fileName: input.fileName, - filePath: input.filePath, - // 필요하면 createdAt/updatedAt 등도 여기서 + status: input.status || "ACTIVE", + + // 📝 null 처리 추가 + fileName: input.fileName || null, + filePath: input.filePath || null, }); return row; }); - + return { data: newTemplate, error: null }; } catch (error) { + console.log(error); return { data: null, error: getErrorMessage(error) }; } } diff --git a/lib/basic-contract/template/add-basic-contract-template-dialog.tsx b/lib/basic-contract/template/add-basic-contract-template-dialog.tsx index fd1bd333..6b6ab105 100644 --- a/lib/basic-contract/template/add-basic-contract-template-dialog.tsx +++ b/lib/basic-contract/template/add-basic-contract-template-dialog.tsx @@ -219,16 +219,21 @@ export function AddTemplateDialog() { setIsLoading(true); try { let uploadResult = null; - + + // 📝 파일 업로드가 필요한 경우에만 업로드 진행 if (formData.file) { const fileId = uuidv4(); uploadResult = await uploadFileInChunks(formData.file, fileId); - + if (!uploadResult?.success) { throw new Error("파일 업로드에 실패했습니다."); } } - + + // 📝 General GTC이고 파일이 없는 경우와 다른 경우 구분 처리 + const isGeneralGTC = formData.templateName === "General GTC"; + const hasFile = uploadResult && uploadResult.success; + const saveResponse = await fetch('/api/upload/basicContract/complete', { method: 'POST', headers: { 'Content-Type': 'application/json' }, @@ -245,17 +250,28 @@ export function AddTemplateDialog() { sysApplicable: formData.sysApplicable, infraApplicable: formData.infraApplicable, status: "ACTIVE", - fileName: uploadResult?.fileName || `${formData.templateName}_v1.docx`, - filePath: uploadResult?.filePath || "", + + // 📝 파일이 있는 경우에만 fileName과 filePath 전송 + ...(hasFile && { + fileName: uploadResult.fileName, + filePath: uploadResult.filePath, + }), + + // 📝 파일이 없는 경우 null 전송 (스키마가 nullable이어야 함) + ...(!hasFile && { + fileName: null, + filePath: null, + }) }), next: { tags: ["basic-contract-templates"] }, }); - + const saveResult = await saveResponse.json(); if (!saveResult.success) { + console.log(saveResult.error); throw new Error(saveResult.error || "템플릿 정보 저장에 실패했습니다."); } - + toast.success('템플릿이 성공적으로 추가되었습니다.'); form.reset(); setSelectedFile(null); diff --git a/lib/basic-contract/validations.ts b/lib/basic-contract/validations.ts index 39248b4a..e8b28e73 100644 --- a/lib/basic-contract/validations.ts +++ b/lib/basic-contract/validations.ts @@ -76,8 +76,8 @@ export const createBasicContractTemplateSchema = z.object({ infraApplicable: z.boolean().default(false), status: z.enum(["ACTIVE", "DISPOSED"]).default("ACTIVE"), - fileName: z.string().min(1), - filePath: z.string().min(1), + fileName: z.string().nullable().optional(), + filePath: z.string().nullable().optional(), // 기존에 쓰시던 validityPeriod 를 계속 쓰실 거라면 남기고, 아니라면 지우세요. // 예: 문자열(YYYY-MM-DD ~ YYYY-MM-DD) 또는 number(개월 수) 등 구체화 필요 -- cgit v1.2.3