partnerService.ts 4.7 KB
import { createApiClient } from "../lib/apiClient";
import { authorizedGetBlobDownload } from "../lib/batchFileHttp";
import {
  normalizePartnerFromApi,
  type PartnerCreateInput,
  type PartnerDetailDto,
  type PartnerGetListInput,
  type PartnerListResult,
  type PartnerUpdateInput,
} from "../types/partner";

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

const PATH = "/partner";

export async function getPartners(input: PartnerGetListInput, signal?: AbortSignal): Promise<PartnerListResult> {
  const raw = await api.requestJson<PartnerListResult & { items?: unknown[]; Items?: unknown[] }>({
    path: PATH,
    method: "GET",
    query: {
      SkipCount: input.skipCount,
      MaxResultCount: input.maxResultCount,
      Sorting: input.sorting,
      Keyword: input.keyword,
      State: input.state,
    },
    signal,
  });
  const itemsRaw = raw.items ?? raw.Items ?? [];
  const items = (Array.isArray(itemsRaw) ? itemsRaw : []).map((x) => normalizePartnerFromApi(x));
  return { ...raw, items, totalCount: raw.totalCount ?? (raw as { TotalCount?: number }).TotalCount ?? items.length };
}

export async function getPartner(id: string, signal?: AbortSignal): Promise<PartnerDetailDto> {
  const raw = await api.requestJson<unknown>({
    path: `/partner/${encodeURIComponent(id)}`,
    method: "GET",
    signal,
  });
  const item = normalizePartnerFromApi(raw);
  const r = raw && typeof raw === "object" ? (raw as Record<string, unknown>) : {};
  const lastModificationTime = (r.lastModificationTime ?? r.LastModificationTime ?? null) as string | null;
  return { ...item, lastModificationTime };
}

function trimOrNull(v: string | null | undefined): string | null {
  const t = (v ?? "").trim();
  return t ? t : null;
}

export async function createPartner(input: PartnerCreateInput, signal?: AbortSignal): Promise<PartnerDetailDto> {
  const raw = await api.requestJson<unknown>({
    path: PATH,
    method: "POST",
    body: {
      partnerName: input.partnerName.trim(),
      contactEmail: trimOrNull(input.contactEmail ?? undefined),
      phoneNumber: trimOrNull(input.phoneNumber ?? undefined),
      state: input.state ?? true,
      street: trimOrNull(input.street ?? undefined),
      city: trimOrNull(input.city ?? undefined),
      stateCode: trimOrNull(input.stateCode ?? undefined),
      country: trimOrNull(input.country ?? undefined),
      zipCode: trimOrNull(input.zipCode ?? undefined),
    },
    signal,
  });
  const item = normalizePartnerFromApi(raw);
  const r = raw && typeof raw === "object" ? (raw as Record<string, unknown>) : {};
  const lastModificationTime = (r.lastModificationTime ?? r.LastModificationTime ?? null) as string | null;
  return { ...item, lastModificationTime };
}

export async function updatePartner(
  id: string,
  input: PartnerUpdateInput,
  signal?: AbortSignal,
): Promise<PartnerDetailDto> {
  const raw = await api.requestJson<unknown>({
    path: `/partner/${encodeURIComponent(id)}`,
    method: "PUT",
    body: {
      partnerName: input.partnerName.trim(),
      contactEmail: trimOrNull(input.contactEmail ?? undefined),
      phoneNumber: trimOrNull(input.phoneNumber ?? undefined),
      state: input.state ?? true,
      street: trimOrNull(input.street ?? undefined),
      city: trimOrNull(input.city ?? undefined),
      stateCode: trimOrNull(input.stateCode ?? undefined),
      country: trimOrNull(input.country ?? undefined),
      zipCode: trimOrNull(input.zipCode ?? undefined),
    },
    signal,
  });
  const item = normalizePartnerFromApi(raw);
  const r = raw && typeof raw === "object" ? (raw as Record<string, unknown>) : {};
  const lastModificationTime = (r.lastModificationTime ?? r.LastModificationTime ?? null) as string | null;
  return { ...item, lastModificationTime };
}

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

export type PartnerExportQuery = {
  keyword?: string;
  state?: boolean;
  sorting?: string;
};

/**
 * 与文档及后端 `ExportPdfAsync([FromQuery] PartnerGetListInputVo)` 一致:`GET /api/app/partner/export-pdf`,
 * Query:`Keyword`、`State`、`Sorting`(全量导出,分页参数不传)。
 */
export async function exportPartnersPdf(input: PartnerExportQuery, signal?: AbortSignal): Promise<void> {
  await authorizedGetBlobDownload({
    path: `${PATH}/export-pdf`,
    query: {
      Keyword: input.keyword,
      State: input.state,
      Sorting: input.sorting,
    },
    defaultFileName: "companies-export.pdf",
    signal,
  });
}