File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
File name
Commit message
Commit date
'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<PointStandardFormState> {
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<PointStandardFormState> {
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' };
}