'use server'; import { revalidatePath } from 'next/cache'; import { verifySession } from '@/lib/auth/dal'; import { deletePointStandard, updatePointStandard, } from '@/lib/data/repositories/point-standard-repository'; import { validatePointStandard, type PointStandardFormState, } from '@/lib/domain/point-standard-form'; import { POINT_STANDARDS_PATH } from '@/lib/domain/point-standard-query'; const SAVE_FAILED_MESSAGE = '저장하지 못했습니다. 잠시 후 다시 시도해 주세요.'; const DELETE_FAILED_MESSAGE = '삭제하지 못했습니다. 잠시 후 다시 시도해 주세요.'; function readString(formData: FormData, key: string): string { const value = formData.get(key); return typeof value === 'string' ? value : ''; } function parseFormNumber(formData: FormData, key: string): number { const trimmed = readString(formData, key).trim(); return trimmed === '' ? NaN : Number(trimmed); } /** 기획 PTS10100002_p — 이벤트는 읽기 전용이라 대상 id는 hidden 필드에서 읽는다. */ export async function updatePointStandardAction( _prevState: PointStandardFormState, formData: FormData ): Promise { await verifySession(); const validation = validatePointStandard({ id: readString(formData, 'id'), point: parseFormNumber(formData, 'point'), limitPoint: parseFormNumber(formData, 'limitPoint'), isDuplicable: readString(formData, 'isDuplicable') === 'Y', description: readString(formData, 'description'), isActive: readString(formData, 'isActive') === 'Y', }); if (!validation.ok) { return { status: 'error', errors: validation.errors }; } try { await updatePointStandard( validation.values, readString(formData, 'eventCode') ); } catch { return { status: 'error', message: SAVE_FAILED_MESSAGE }; } revalidatePath(POINT_STANDARDS_PATH); return { status: 'success' }; } export async function deletePointStandardAction( id: string ): Promise<{ status: 'success' } | { status: 'error'; message: string }> { await verifySession(); try { await deletePointStandard(id); } catch { return { status: 'error', message: DELETE_FAILED_MESSAGE }; } revalidatePath(POINT_STANDARDS_PATH); return { status: 'success' }; }