diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-12 08:01:02 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-09-12 08:01:02 +0000 |
| commit | a9575387c3a765a1a65ebc179dae16a21af6eb25 (patch) | |
| tree | 347f2b17b07039080fb2f116460004ba0b75a779 /lib/general-contract-template/actions.ts | |
| parent | 47e527f5f763658600696ee58451fb666e692f5a (diff) | |
(임수민) 일반 계약 템플릿 구현 및 basic contract 필터 수정
Diffstat (limited to 'lib/general-contract-template/actions.ts')
| -rw-r--r-- | lib/general-contract-template/actions.ts | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/lib/general-contract-template/actions.ts b/lib/general-contract-template/actions.ts new file mode 100644 index 00000000..eb236173 --- /dev/null +++ b/lib/general-contract-template/actions.ts @@ -0,0 +1,134 @@ +"use server" + +import { revalidateTag, revalidatePath } from 'next/cache' +import db from '@/db/db' +import { generalContractTemplates } from '@/db/schema' +import { eq, inArray } from 'drizzle-orm' +import { createContractTemplate } from '@/lib/general-contract-template/service' + +export async function disposeTemplates(templateIds: number[]) { + try { + if (!templateIds || !Array.isArray(templateIds) || templateIds.length === 0) { + throw new Error('폐기할 템플릿 ID가 필요합니다.') + } + + // 템플릿들을 DISPOSED 상태로 업데이트하고 폐기일시 설정 + await db + .update(generalContractTemplates) + .set({ + status: 'DISPOSED', + disposedAt: new Date(), + updatedAt: new Date(), + }) + .where(inArray(generalContractTemplates.id, templateIds)) + + // 캐시 무효화 + revalidateTag('general-contract-templates') + revalidatePath('/evcp/general-contract-template') + + return { + success: true, + message: `${templateIds.length}개의 템플릿이 폐기되었습니다.`, + disposedCount: templateIds.length + } + + } catch (error) { + console.error('폐기 처리 오류:', error) + throw new Error('폐기 처리 중 오류가 발생했습니다.') + } +} + +export async function restoreTemplates(templateIds: number[]) { + try { + if (!templateIds || !Array.isArray(templateIds) || templateIds.length === 0) { + throw new Error('복구할 템플릿 ID가 필요합니다.') + } + + // 템플릿들을 ACTIVE 상태로 업데이트하고 폐기일시 제거 + await db + .update(generalContractTemplates) + .set({ + status: 'ACTIVE', + disposedAt: null, + updatedAt: new Date(), + }) + .where(inArray(generalContractTemplates.id, templateIds)) + + // 캐시 무효화 + revalidateTag('general-contract-templates') + revalidatePath('/evcp/general-contract-template') + + return { + success: true, + message: `${templateIds.length}개의 템플릿이 복구되었습니다.`, + restoredCount: templateIds.length + } + + } catch (error) { + console.error('복구 처리 오류:', error) + throw new Error('복구 처리 중 오류가 발생했습니다.') + } +} + +export async function createGeneralContractTemplateRevisionAction(input: { + baseTemplateId: number; + contractTemplateName: string; + contractTemplateType: string; + revision: number; + legalReviewRequired: boolean; + fileName: string; + filePath: string; +}) { + try { + const { createGeneralContractTemplateRevision } = await import('../general-contract-template/service'); + + const { data, error } = await createGeneralContractTemplateRevision({ + ...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 createTemplateFromUpload(input: { + contractTemplateType: string + contractTemplateName: string + legalReviewRequired: boolean + fileName: string + filePath: string +}) { + try { + const { data, error } = await createContractTemplate({ + 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('general-contract-templates') + revalidatePath('/evcp/general-contract-template') + + return { success: true, id: data?.id } + } catch (e: any) { + return { success: false, error: e?.message || '템플릿 생성 실패' } + } +} |
