import { API_PATHS } from "@/api/api-paths"; import { apiDelete, apiGet, apiPost, apiPut } from "@/api/api"; import { handleApiResponse, handlePaginatedResponse } from "@/api/handle-api-response"; import { mapVendor, mapVendorDeactivationImpact, mapVendorFacets, mapVendorListItems, mapVendorPortalToken, mapVendorToBackend, mapVendorUpdateToBackend, } from "@/domain/vendors/mappers/vendor-mapper"; import type { Vendor, VendorDeactivationImpact, VendorFacets, VendorPortalToken, VendorsListParams, VendorsListResult, } from "@/domain/vendors/types/vendor"; function pushRepeated( searchParams: Record, key: string, values: string[] | undefined, ): void { if (!values || values.length === 0) return; values.forEach((value, index) => { if (!value) return; searchParams[`${key}[${index}]`] = value; }); } export interface VendorFacetsParams { isActive?: boolean; } function buildFacetsParams(params?: VendorFacetsParams): Record { const searchParams: Record = {}; if (params?.isActive !== undefined) { searchParams.isActive = String(params.isActive); } return searchParams; } function buildListParams(params: VendorsListParams): Record { const searchParams: Record = { search: params.search ?? "", page: params.page ?? 1, pageSize: params.pageSize ?? 12, }; if (params.isActive !== undefined) { searchParams.isActive = String(params.isActive); } pushRepeated(searchParams, "companies", params.companies); pushRepeated(searchParams, "trades", params.trades); pushRepeated(searchParams, "locations", params.locations); pushRepeated(searchParams, "jobBuckets", params.jobBuckets); return searchParams; } export const vendorsApi = { getList: async (params: VendorsListParams = {}): Promise => { const data = await apiGet(API_PATHS.vendor.getList, { searchParams: buildListParams(params), }); const paginated = handlePaginatedResponse(data, { page: params.page, pageSize: params.pageSize, }); return { items: mapVendorListItems(paginated.items), totalCount: paginated.totalCount, page: paginated.page, pageSize: paginated.pageSize, }; }, getFacets: async (params?: VendorFacetsParams): Promise => { const data = await apiGet(API_PATHS.vendor.facets, { searchParams: buildFacetsParams(params), }); return mapVendorFacets(handleApiResponse(data)); }, getById: async (id: string | number): Promise => { const data = await apiGet(`${API_PATHS.rest.vendors}/${id}`); return mapVendor(handleApiResponse(data)); }, create: async (payload: unknown): Promise => { const data = await apiPost(API_PATHS.rest.vendors, mapVendorToBackend(payload)); return mapVendor(handleApiResponse(data)); }, update: async (id: string | number, payload: unknown): Promise => { const data = await apiPut( `${API_PATHS.rest.vendors}/${id}`, mapVendorUpdateToBackend(payload), ); return mapVendor(handleApiResponse(data)); }, delete: async (id: string | number): Promise => { await apiDelete(`${API_PATHS.rest.vendors}/${id}`); }, getDeactivationImpact: async (id: string | number): Promise => { const data = await apiGet( `${API_PATHS.rest.vendors}/${id}/${API_PATHS.vendor.deactivationImpact}`, ); return mapVendorDeactivationImpact(handleApiResponse(data)); }, getPortalToken: async (id: string | number): Promise => { const data = await apiGet(`${API_PATHS.rest.vendors}/${id}/portal-token`); return mapVendorPortalToken(handleApiResponse(data)); }, rotatePortalToken: async (id: string | number): Promise => { const data = await apiPost(`${API_PATHS.rest.vendors}/${id}/portal-token/rotate`); return mapVendorPortalToken(handleApiResponse(data)); }, revokePortalToken: async (id: string | number): Promise => { await apiPost(`${API_PATHS.rest.vendors}/${id}/portal-token/revoke`); }, };