Files
optima/api/src/modules/cw-utils/fetchAllCompanies.ts
T

65 lines
2.0 KiB
TypeScript

import { Collection } from "@discordjs/collection";
import { connectWiseApi } from "../../constants";
import { runCollector } from "../collector-client/runCollector";
import {
CollectorCompanyRecord,
NormalizedCompanyRecord,
} from "../../types/CompanySourceTypes";
import { normalizeCompanyRecords } from "./companyTranslation";
const toCompanyCollection = (
companies: NormalizedCompanyRecord[],
): Collection<number, NormalizedCompanyRecord> => {
const allCompanies = new Collection<number, NormalizedCompanyRecord>();
for (const company of companies) {
allCompanies.set(company.id, company);
}
return allCompanies;
};
export const fetchAllCwCompanies = async (): Promise<
Collection<number, NormalizedCompanyRecord>
> => {
try {
console.log("[fetchAllCwCompanies] Attempting to fetch via collector...");
const collectorCompanies =
await runCollector<CollectorCompanyRecord[]>("fetchCompanies");
if (!Array.isArray(collectorCompanies)) {
throw new Error("Collector payload was not an array");
}
console.log(
`[fetchAllCwCompanies] ✓ Successfully used collector data (${collectorCompanies.length} companies)`,
);
return toCompanyCollection(normalizeCompanyRecords(collectorCompanies));
} catch (err) {
console.error(
`[fetchAllCwCompanies] ✗ Collector fetchCompanies failed, falling back to CW API:`,
err instanceof Error ? { message: err.message, stack: err.stack } : err,
);
}
let allCompanies = new Collection<number, NormalizedCompanyRecord>();
const pageCount = 1000;
const count = (await connectWiseApi.get("/company/companies/count")).data
.count;
const totalPages = Math.ceil(count / pageCount);
for (let page = 0; page < totalPages; page++) {
const response = await connectWiseApi.get(
`/company/companies?page=${page + 1}&pageSize=${pageCount}`,
);
const normalizedCompanies = normalizeCompanyRecords(response.data);
for (const company of normalizedCompanies) {
allCompanies.set(company.id, company);
}
}
return allCompanies;
};