'use server'; import { revalidatePath } from 'next/cache'; import { unstable_rethrow } from 'next/navigation'; import { verifySession } from '@/lib/auth/dal'; import { BackendRequestError } from '@/lib/http/backend-fetch'; import { createMerchant, updateMerchant } from '@/lib/data/repositories/merchant-repository'; import { validateMerchant, type MerchantFormState } from '@/lib/domain/merchant-form'; import { MERCHANTS_PATH } from '@/lib/domain/merchant-query'; const SAVE_FAILED_MESSAGE = '저장하지 못했습니다. 잠시 후 다시 시도해 주세요.'; function readString(formData: FormData, key: string): string { const value = formData.get(key); return typeof value === 'string' ? value : ''; } export async function saveMerchantAction( _prevState: MerchantFormState, formData: FormData ): Promise { await verifySession(); const validation = validateMerchant({ id: readString(formData, 'id'), brandName: readString(formData, 'brandName'), memo: readString(formData, 'memo'), name: readString(formData, 'name'), categoryCode: readString(formData, 'categoryCode'), businessNumber: readString(formData, 'businessNumber'), ownerName: readString(formData, 'ownerName'), phoneNumber: readString(formData, 'phoneNumber'), address: readString(formData, 'address'), addressDetail: readString(formData, 'addressDetail'), postalCode: readString(formData, 'postalCode'), latitude: readString(formData, 'latitude'), longitude: readString(formData, 'longitude'), bankHolderName: readString(formData, 'bankHolderName'), bankCode: readString(formData, 'bankCode'), accountNumber: readString(formData, 'accountNumber'), businessStatusCode: readString(formData, 'businessStatusCode'), divisionCode: readString(formData, 'divisionCode'), isVisible: readString(formData, 'isVisible') === 'Y', }); if (!validation.ok) { return { status: 'error', errors: validation.errors }; } try { if (validation.values.id) { await updateMerchant(validation.values.id, validation.values); } else { await createMerchant(validation.values); } } catch (error) { unstable_rethrow(error); console.error('[merchants] 저장 실패', error); const message = error instanceof BackendRequestError && error.message ? error.message : SAVE_FAILED_MESSAGE; return { status: 'error', message }; } revalidatePath(MERCHANTS_PATH); return { status: 'success' }; }