임동욱 임동욱 08-20
merge: 메뉴 등록 파라미터 수정
@10bb1d6f6832b0d416cb68ab4c3bb7563d6e798a
lib/data/repositories/system-menu-repository.ts
--- lib/data/repositories/system-menu-repository.ts
+++ lib/data/repositories/system-menu-repository.ts
@@ -108,23 +108,40 @@
     topYn: values.isTopActive ? 'Y' : 'N',
     menuUrl: values.url,
     menuExplan: values.description,
-    // 빈 문자열을 그대로 보낸다 — UPDATE가 null만 건너뛰므로 이래야 아이콘을 지울 수 있다.
-    atchFileId: values.largeIconId,
-    smallAtchFileId: values.smallIconId,
     useYn: values.isActive ? 'Y' : 'N',
   };
+}
+
+function logFailure(
+  action: string,
+  result: { code: number; message: string },
+  params: Record<string, unknown>
+): void {
+  console.error(`[system-menu] ${action} 실패`, {
+    code: result.code,
+    message: result.message,
+    params,
+  });
 }
 
 export async function createSystemMenu(values: SystemMenuValues): Promise<void> {
   const accessToken = await getSessionAccessToken();
 
+  // 등록에는 지울 아이콘이 없다. 빈 문자열을 보내면 파일 테이블을 가리키는 값이 되어
+  // 제약에 걸릴 수 있으므로 고른 것이 있을 때만 싣는다.
+  const params = {
+    ...toWriteParams(values),
+    upMenuId: values.parentId,
+    menuIdPath: values.parentIdPath || undefined,
+    // INSERT에 DEFAULT_YN이 들어가는데 화면에는 없는 항목이다. 보내지 않으면 NULL이 박힌다.
+    defaultYn: 'N',
+    ...(values.largeIconId ? { atchFileId: values.largeIconId } : {}),
+    ...(values.smallIconId ? { smallAtchFileId: values.smallIconId } : {}),
+  };
+
   const result = await backendFetch<unknown>(MENU_PATH, {
     method: 'POST',
-    form: {
-      ...toWriteParams(values),
-      upMenuId: values.parentId,
-      menuIdPath: values.parentIdPath || undefined,
-    },
+    form: params,
     accessToken: accessToken ?? undefined,
     cache: 'no-store',
     canHaveNullData: true,
@@ -132,6 +149,7 @@
   });
 
   if (!result.ok) {
+    logFailure('등록', result, params);
     throw new BackendRequestError(result);
   }
 }
@@ -139,9 +157,16 @@
 export async function updateSystemMenu(values: SystemMenuValues): Promise<void> {
   const accessToken = await getSessionAccessToken();
 
+  // 수정은 빈 문자열을 그대로 보낸다 — UPDATE가 null만 건너뛰므로 이래야 아이콘을 지울 수 있다.
+  const params = {
+    ...toWriteParams(values),
+    atchFileId: values.largeIconId,
+    smallAtchFileId: values.smallIconId,
+  };
+
   const result = await backendFetch<unknown>(`${MENU_PATH}/${values.id}`, {
     method: 'PUT',
-    body: toWriteParams(values),
+    body: params,
     accessToken: accessToken ?? undefined,
     cache: 'no-store',
     canHaveNullData: true,
@@ -149,6 +174,7 @@
   });
 
   if (!result.ok) {
+    logFailure('수정', result, params);
     throw new BackendRequestError(result);
   }
 }
Add a comment
List