import { Collection } from "@discordjs/collection"; import { connectWiseApi } from "../../../constants"; import { CatalogItem } from "./catalog.types.ts"; export interface CatalogSummary { id: number; _info?: Record; } export interface InventoryEntry { id: number; onHand: number; } export const catalogCw = { countItems: async (): Promise => { const response = await connectWiseApi.get("/procurement/catalog/count"); return response.data.count; }, fetchAllCatalogSummary: async (): Promise< Collection > => { const allItems = new Collection(); const pageSize = 1000; const count = await catalogCw.countItems(); const totalPages = Math.ceil(count / pageSize); for (let page = 0; page < totalPages; page++) { const response = await connectWiseApi.get( `/procurement/catalog?page=${page + 1}&pageSize=${pageSize}&fields=id,_info`, ); const items: CatalogSummary[] = response.data; for (const item of items) { allItems.set(item.id, item); } } return allItems; }, fetchInventoryOnHand: async (cwCatalogId: number): Promise => { const response = await connectWiseApi.get( `/procurement/catalog/${cwCatalogId}/inventory?fields=onHand`, ); const entries: InventoryEntry[] = response.data; return entries.reduce((sum, e) => sum + (e.onHand || 0), 0); }, fetchAllItemsFromCw: async (): Promise> => { const allItems = new Collection(); const pageSize = 1000; const count = await catalogCw.countItems(); const totalPages = Math.ceil(count / pageSize); for (let page = 0; page < totalPages; page++) { const response = await connectWiseApi.get( `/procurement/catalog?page=${page + 1}&pageSize=${pageSize}`, ); const items: CatalogItem[] = response.data; for (const item of items) { allItems.set(item.id, item); } } return allItems; }, fetchByCatalogId: async (cwCatalogId: number): Promise => { try { const response = await connectWiseApi.get( `/procurement/catalog/${cwCatalogId}`, ); return response.data; } catch { const fallback = await connectWiseApi.get( `/procurement/catalog/items/${cwCatalogId}`, ); return fallback.data; } }, fetch: async (id: string): Promise => { const numericId = Number(id); if (!Number.isFinite(numericId)) { const response = await connectWiseApi.get( `/procurement/catalog/items/${id}`, ); return response.data; } return catalogCw.fetchByCatalogId(numericId); }, };