'use server'; import { revalidatePath } from 'next/cache'; import { verifySession } from '@/lib/auth/dal'; import { fetchCommonCodes } from '@/lib/data/repositories/common-code-repository'; import { createPointStandard, deletePointStandard, updatePointStandard, } from '@/lib/data/repositories/point-standard-repository'; import { CODE_GROUP } from '@/lib/domain/common-code'; 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); } function readFormValues(formData: FormData) { return { id: readString(formData, 'id'), eventCode: readString(formData, 'eventCode'), point: parseFormNumber(formData, 'point'), limitPoint: parseFormNumber(formData, 'limitPoint'), isDuplicable: readString(formData, 'isDuplicable') === 'Y', description: readString(formData, 'description'), isActive: readString(formData, 'isActive') === 'Y', }; } /** 기획 PTS10100002_p(등록) — 이벤트는 등록된 코드 중에서 고른다. */ export async function createPointStandardAction( _prevState: PointStandardFormState, formData: FormData ): Promise { await verifySession(); const validation = validatePointStandard(readFormValues(formData), { isCreate: true, // 화면이 보낸 코드를 그대로 믿지 않는다 — 저장 직전에 코드표를 다시 조회해 대조한다. allowedEventCodes: ( await fetchCommonCodes(CODE_GROUP.pointEvent) ).map((code) => code.code), }); if (!validation.ok) { return { status: 'error', errors: validation.errors }; } try { await createPointStandard(validation.values); } catch { return { status: 'error', message: SAVE_FAILED_MESSAGE }; } revalidatePath(POINT_STANDARDS_PATH); return { status: 'success' }; } /** 기획 PTS10100002_p(수정) — 이벤트는 읽기 전용이라 hidden으로 실려 온다. */ export async function updatePointStandardAction( _prevState: PointStandardFormState, formData: FormData ): Promise { await verifySession(); const validation = validatePointStandard(readFormValues(formData), { isCreate: false, }); if (!validation.ok) { return { status: 'error', errors: validation.errors }; } try { await updatePointStandard(validation.values); } 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' }; }