menuService.ts 2.22 KB
import { createApiClient } from "../lib/apiClient";
import type { MenuCreateInput, MenuDto, MenuGetListInput, MenuUpdateInput, PagedResultDto } from "../types/menu";

const api = createApiClient({
  getToken: () => {
    try {
      return localStorage.getItem("access_token") ?? localStorage.getItem("token") ?? null;
    } catch {
      return null;
    }
  },
});

// Keep routes easy to adjust during integration (Swagger not accessible).
const MENU_PATH = "/menu";

export type MenuServiceRouteMode = "abp" | "plain";

function prefixFor(mode: MenuServiceRouteMode | undefined): string {
  return mode === "plain" ? "" : "/api/app";
}

export async function getMenus(
  input: MenuGetListInput,
  signal?: AbortSignal,
  routeMode: MenuServiceRouteMode = "abp",
): Promise<PagedResultDto<MenuDto>> {
  return api.requestJson<PagedResultDto<MenuDto>>({
    path: MENU_PATH,
    method: "GET",
    query: {
      SkipCount: input.skipCount,
      MaxResultCount: input.maxResultCount,
      Sorting: input.sorting,
      Keyword: input.keyword,
    },
    signal,
    prefix: prefixFor(routeMode),
  });
}

export async function createMenu(input: MenuCreateInput, routeMode: MenuServiceRouteMode = "abp"): Promise<MenuDto> {
  return api.requestJson<MenuDto>({
    path: MENU_PATH,
    method: "POST",
    body: {
      name: input.name,
      path: input.path,
      icon: input.icon,
      order: input.order,
      parentId: input.parentId,
      isEnabled: input.isEnabled ?? true,
    },
    prefix: prefixFor(routeMode),
  });
}

export async function updateMenu(
  id: string,
  input: MenuUpdateInput,
  routeMode: MenuServiceRouteMode = "abp",
): Promise<MenuDto> {
  return api.requestJson<MenuDto>({
    path: `${MENU_PATH}/${encodeURIComponent(id)}`,
    method: "PUT",
    body: {
      name: input.name,
      path: input.path,
      icon: input.icon,
      order: input.order,
      parentId: input.parentId,
      isEnabled: input.isEnabled ?? true,
    },
    prefix: prefixFor(routeMode),
  });
}

export async function deleteMenu(id: string, routeMode: MenuServiceRouteMode = "abp"): Promise<void> {
  await api.requestJson<unknown>({
    path: `${MENU_PATH}/${encodeURIComponent(id)}`,
    method: "DELETE",
    prefix: prefixFor(routeMode),
  });
}