labelMultipleOptionService.ts 3.67 KB
import { createApiClient } from "../lib/apiClient";
import type {
  LabelMultipleOptionCreateInput,
  LabelMultipleOptionDto,
  LabelMultipleOptionGetListInput,
  LabelMultipleOptionUpdateInput,
  PagedResultDto,
} from "../types/labelMultipleOption";

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

const PATH = "/label-multiple-option";

/** 接口存的是 JSON 字符串;列表/详情可能返回 string 或已反序列化的 array */
function parseOptionValuesJsonField(raw: unknown): string[] {
  if (raw == null) return [];
  if (Array.isArray(raw)) return raw.map((x) => String(x));
  if (typeof raw === "string") {
    const t = raw.trim();
    if (!t) return [];
    try {
      const p = JSON.parse(t) as unknown;
      if (Array.isArray(p)) return p.map((x) => String(x));
      return [];
    } catch {
      return [];
    }
  }
  return [];
}

function normalizeLabelMultipleOptionDto(item: LabelMultipleOptionDto): LabelMultipleOptionDto {
  const raw = item as LabelMultipleOptionDto & { optionValuesJson?: unknown };
  return {
    ...item,
    optionValuesJson: parseOptionValuesJsonField(raw.optionValuesJson),
  };
}

function normalizePaged(res: PagedResultDto<LabelMultipleOptionDto>): PagedResultDto<LabelMultipleOptionDto> {
  return {
    totalCount: res.totalCount ?? 0,
    items: (res.items ?? []).map(normalizeLabelMultipleOptionDto),
  };
}

/** 创建/更新 Body:`optionValuesJson` 须为 string[] 的 JSON 字符串 */
function optionValuesJsonToApiBody(values: string[]): string {
  return JSON.stringify(values);
}

export async function getLabelMultipleOptions(input: LabelMultipleOptionGetListInput, signal?: AbortSignal): Promise<PagedResultDto<LabelMultipleOptionDto>> {
  const res = await api.requestJson<PagedResultDto<LabelMultipleOptionDto>>({
    path: PATH,
    method: "GET",
    query: {
      SkipCount: input.skipCount,
      MaxResultCount: input.maxResultCount,
      Sorting: input.sorting,
      Keyword: input.keyword,
      State: input.state,
    },
    signal,
  });
  return normalizePaged(res);
}

export async function getLabelMultipleOption(id: string, signal?: AbortSignal): Promise<LabelMultipleOptionDto> {
  const d = await api.requestJson<LabelMultipleOptionDto>({
    path: `${PATH}/${encodeURIComponent(id)}`,
    method: "GET",
    signal,
  });
  return normalizeLabelMultipleOptionDto(d);
}

export async function createLabelMultipleOption(input: LabelMultipleOptionCreateInput): Promise<LabelMultipleOptionDto> {
  const d = await api.requestJson<LabelMultipleOptionDto>({
    path: PATH,
    method: "POST",
    body: {
      optionCode: input.optionCode,
      optionName: input.optionName,
      optionValuesJson: optionValuesJsonToApiBody(input.optionValuesJson),
      state: input.state ?? true,
      orderNum: input.orderNum,
    },
  });
  return normalizeLabelMultipleOptionDto(d);
}

export async function updateLabelMultipleOption(id: string, input: LabelMultipleOptionUpdateInput): Promise<LabelMultipleOptionDto> {
  const d = await api.requestJson<LabelMultipleOptionDto>({
    path: `${PATH}/${encodeURIComponent(id)}`,
    method: "PUT",
    body: {
      optionCode: input.optionCode,
      optionName: input.optionName,
      optionValuesJson: optionValuesJsonToApiBody(input.optionValuesJson),
      state: input.state ?? true,
      orderNum: input.orderNum,
    },
  });
  return normalizeLabelMultipleOptionDto(d);
}

export async function deleteLabelMultipleOption(id: string): Promise<void> {
  await api.requestJson<unknown>({
    path: `${PATH}/${encodeURIComponent(id)}`,
    method: "DELETE",
  });
}