From c54e2acaed641b7ae2c1a7304b08626f9ca973db Mon Sep 17 00:00:00 2001 From: dujinkim Date: Wed, 17 Sep 2025 05:39:58 +0000 Subject: (임수민) 기본계약 폐기하기, 수정하기 수정 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/basic-contract/actions.ts | 135 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 lib/basic-contract/actions.ts (limited to 'lib/basic-contract/actions.ts') diff --git a/lib/basic-contract/actions.ts b/lib/basic-contract/actions.ts new file mode 100644 index 00000000..0af9b948 --- /dev/null +++ b/lib/basic-contract/actions.ts @@ -0,0 +1,135 @@ +"use server" + +import { revalidateTag, revalidatePath } from 'next/cache' +import db from '@/db/db' +import { basicContractTemplates } from '@/db/schema' +import { eq, inArray } from 'drizzle-orm' + +export async function disposeDocuments(documentIds: number[]) { + try { + if (!documentIds || !Array.isArray(documentIds) || documentIds.length === 0) { + throw new Error('폐기할 문서 ID가 필요합니다.') + } + + // 문서들을 DISPOSED 상태로 업데이트하고 폐기일시 설정 + await db + .update(basicContractTemplates) + .set({ + status: 'DISPOSED', + disposedAt: new Date(), + updatedAt: new Date(), + }) + .where(inArray(basicContractTemplates.id, documentIds)) + + // 캐시 무효화 + revalidateTag('basic-contract-templates') + revalidatePath('/evcp/basic-contract-template') + + return { + success: true, + message: `${documentIds.length}개의 문서가 폐기되었습니다.`, + disposedCount: documentIds.length + } + + } catch (error) { + console.error('문서 폐기 처리 오류:', error) + throw new Error('문서 폐기 처리 중 오류가 발생했습니다.') + } +} + +export async function restoreDocuments(documentIds: number[]) { + try { + if (!documentIds || !Array.isArray(documentIds) || documentIds.length === 0) { + throw new Error('복구할 문서 ID가 필요합니다.') + } + + // 문서들을 ACTIVE 상태로 업데이트하고 폐기일시 제거 + await db + .update(basicContractTemplates) + .set({ + status: 'ACTIVE', + disposedAt: null, + updatedAt: new Date(), + }) + .where(inArray(basicContractTemplates.id, documentIds)) + + // 캐시 무효화 + revalidateTag('basic-contract-templates') + revalidatePath('/evcp/basic-contract-template') + + return { + success: true, + message: `${documentIds.length}개의 문서가 복구되었습니다.`, + restoredCount: documentIds.length + } + + } catch (error) { + console.error('문서 복구 처리 오류:', error) + throw new Error('문서 복구 처리 중 오류가 발생했습니다.') + } +} + +export async function createDocumentRevisionAction(input: { + baseDocumentId: number; + contractTemplateName: string; + contractTemplateType: string; + revision: number; + legalReviewRequired: boolean; + fileName: string; + filePath: string; +}) { + try { + const { createBasicContractTemplateRevision } = await import('./service'); + + const { data, error } = await createBasicContractTemplateRevision({ + ...input, + status: 'ACTIVE' as const + }); + + if (error) { + throw new Error(error); + } + + return { + success: true, + data, + message: `${input.contractTemplateName} v${input.revision} 리비전이 성공적으로 생성되었습니다.` + }; + + } catch (error) { + console.error('문서 리비전 생성 오류:', error); + throw new Error(error instanceof Error ? error.message : '문서 리비전 생성 중 오류가 발생했습니다.'); + } +} + +// 업로드 완료 후 문서 생성 (클라이언트에서 직접 호출 가능한 서버 액션) +export async function createDocumentFromUpload(input: { + contractTemplateType: string + contractTemplateName: string + legalReviewRequired: boolean + fileName: string + filePath: string +}) { + try { + const { createBasicContractTemplate } = await import('./service'); + + const { data, error } = await createBasicContractTemplate({ + contractTemplateType: input.contractTemplateType, + contractTemplateName: input.contractTemplateName, + revision: 1, + status: 'ACTIVE', + legalReviewRequired: input.legalReviewRequired, + fileName: input.fileName, + filePath: input.filePath, + } as any) + + if (error) throw new Error(error) + + revalidateTag('basic-contract-templates') + revalidatePath('/evcp/basic-contract-template') + + return { success: true, id: data?.id } + } catch (e: any) { + return { success: false, error: e?.message || '문서 생성 실패' } + } +} -- cgit v1.2.3