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 { const raw = await api.requestJson({ 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 { const raw = await api.requestJson({ path: `/partner/${encodeURIComponent(id)}`, method: "GET", signal, }); const item = normalizePartnerFromApi(raw); const r = raw && typeof raw === "object" ? (raw as Record) : {}; 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 { const raw = await api.requestJson({ 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) : {}; const lastModificationTime = (r.lastModificationTime ?? r.LastModificationTime ?? null) as string | null; return { ...item, lastModificationTime }; } export async function updatePartner( id: string, input: PartnerUpdateInput, signal?: AbortSignal, ): Promise { const raw = await api.requestJson({ 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) : {}; const lastModificationTime = (r.lastModificationTime ?? r.LastModificationTime ?? null) as string | null; return { ...item, lastModificationTime }; } export async function deletePartner(id: string, signal?: AbortSignal): Promise { await api.requestJson({ 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 { await authorizedGetBlobDownload({ path: `${PATH}/export-pdf`, query: { Keyword: input.keyword, State: input.state, Sorting: input.sorting, }, defaultFileName: "companies-export.pdf", signal, }); }