'use server'; import { verifySession } from '@/lib/auth/dal'; import { validateMerchant, type MerchantFormState, } from '@/lib/domain/merchant-form'; /** * TODO(백엔드): 등록이 자체 저장에서 BizPlay 외부 가맹점 등록 API 위임으로 바뀌었다 — * `POST /api/v1/mngr/voc`가 @RequestBody(JSON)가 되고 `bizPlayVocApiService.insertVoc`를 * 부른다. 예금주명·입금은행코드·입금계좌번호·업태코드가 새로 필수인데 이 폼은 받지 않는다. * 항목이 정해질 때까지 등록을 막는다. * * 화면의 [등록] 버튼만 비활성화하면 막은 것이 아니다 — Server Action은 UI를 거치지 않고도 * 직접 호출된다. 그래서 저장 직전에서 끊는다. */ const DISABLED_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'), isVisible: readString(formData, 'isVisible') === 'Y', }); if (!validation.ok) { return { status: 'error', errors: validation.errors }; } return { status: 'error', message: DISABLED_MESSAGE }; }