"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 || '템플릿 생성 실패' } } }