mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-02 09:43:12 +00:00
128 lines
4.2 KiB
TypeScript
128 lines
4.2 KiB
TypeScript
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<string, string | number>,
|
|
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<string, string> {
|
|
const searchParams: Record<string, string> = {};
|
|
if (params?.isActive !== undefined) {
|
|
searchParams.isActive = String(params.isActive);
|
|
}
|
|
return searchParams;
|
|
}
|
|
|
|
function buildListParams(params: VendorsListParams): Record<string, string | number> {
|
|
const searchParams: Record<string, string | number> = {
|
|
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<VendorsListResult> => {
|
|
const data = await apiGet<unknown>(API_PATHS.vendor.getList, {
|
|
searchParams: buildListParams(params),
|
|
});
|
|
const paginated = handlePaginatedResponse<unknown>(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<VendorFacets> => {
|
|
const data = await apiGet<unknown>(API_PATHS.vendor.facets, {
|
|
searchParams: buildFacetsParams(params),
|
|
});
|
|
return mapVendorFacets(handleApiResponse(data));
|
|
},
|
|
|
|
getById: async (id: string | number): Promise<Vendor> => {
|
|
const data = await apiGet<unknown>(`${API_PATHS.rest.vendors}/${id}`);
|
|
return mapVendor(handleApiResponse(data));
|
|
},
|
|
|
|
create: async (payload: unknown): Promise<Vendor> => {
|
|
const data = await apiPost<unknown>(API_PATHS.rest.vendors, mapVendorToBackend(payload));
|
|
return mapVendor(handleApiResponse(data));
|
|
},
|
|
|
|
update: async (id: string | number, payload: unknown): Promise<Vendor> => {
|
|
const data = await apiPut<unknown>(
|
|
`${API_PATHS.rest.vendors}/${id}`,
|
|
mapVendorUpdateToBackend(payload),
|
|
);
|
|
return mapVendor(handleApiResponse(data));
|
|
},
|
|
|
|
delete: async (id: string | number): Promise<void> => {
|
|
await apiDelete(`${API_PATHS.rest.vendors}/${id}`);
|
|
},
|
|
|
|
getDeactivationImpact: async (id: string | number): Promise<VendorDeactivationImpact> => {
|
|
const data = await apiGet<unknown>(
|
|
`${API_PATHS.rest.vendors}/${id}/${API_PATHS.vendor.deactivationImpact}`,
|
|
);
|
|
return mapVendorDeactivationImpact(handleApiResponse(data));
|
|
},
|
|
|
|
getPortalToken: async (id: string | number): Promise<VendorPortalToken | null> => {
|
|
const data = await apiGet<unknown>(`${API_PATHS.rest.vendors}/${id}/portal-token`);
|
|
return mapVendorPortalToken(handleApiResponse(data));
|
|
},
|
|
|
|
rotatePortalToken: async (id: string | number): Promise<VendorPortalToken | null> => {
|
|
const data = await apiPost<unknown>(`${API_PATHS.rest.vendors}/${id}/portal-token/rotate`);
|
|
return mapVendorPortalToken(handleApiResponse(data));
|
|
},
|
|
|
|
revokePortalToken: async (id: string | number): Promise<void> => {
|
|
await apiPost<unknown>(`${API_PATHS.rest.vendors}/${id}/portal-token/revoke`);
|
|
},
|
|
};
|