File name
Commit message
Commit date
File name
Commit message
Commit date
09-16
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 { unstable_rethrow } from 'next/navigation';
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 (error) {
// 이슈: 세션이 밀렸을 때 backendFetch가 던지는 redirect를 이 catch가 삼키면 안 된다.
unstable_rethrow(error);
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 (error) {
unstable_rethrow(error);
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 (error) {
unstable_rethrow(error);
return { status: 'error', message: DELETE_FAILED_MESSAGE };
}
revalidatePath(POINT_STANDARDS_PATH);
return { status: 'success' };
}