shoc-frontend-new/src/app/(protected)/workorders/_hooks/build-resolved-board-search-params.ts
Arthur Bassi 6e99dc0af2 refactor(work-orders): pass board-api governance maintainability gate
Split oversized API/mapper/UI modules and extract focused helpers so the
exact head satisfies godfile and complexity ratchets without relaxing thresholds.
2026-07-28 09:56:27 -03:00

72 lines
2.4 KiB
TypeScript

import type { WorkOrderAdvancedFilters } from "@/domain/work-orders/types/work-order-advanced-filters";
import type {
LocationOption,
VendorDropdownItem,
} from "@/domain/work-orders/types/work-order-common";
import type { WorkOrderBoardSearchQueryParams } from "@/domain/work-orders/types/work-order-board";
import {
BOARD_SEARCH_MAX_PAGE_SIZE,
toBoardSearchQueryParams,
} from "@/domain/work-orders/utils/board-query-params";
import { resolveSiteCode } from "@/domain/work-orders/mappers/work-order-board-mapper";
export type ResolvedBoardSearchParamsInput = {
advApplied: WorkOrderAdvancedFilters | null;
search: string;
page: number;
pageSize: number;
sortBy: string;
sortDir: string;
locations: LocationOption[];
vendors: VendorDropdownItem[];
};
function resolveSiteCodes(sites: Set<string>, locations: LocationOption[]): Set<string> {
const siteCodes = new Set<string>();
for (const siteKey of sites) {
const location = locations.find((item) => String(item.id) === siteKey);
if (location) {
const code = resolveSiteCode({ siteCode: location.siteCode, name: location.name });
if (code) {
siteCodes.add(code);
}
} else if (siteKey.trim()) {
siteCodes.add(siteKey);
}
}
return siteCodes;
}
function buildVendorIdsByCompanyName(vendors: VendorDropdownItem[]): Map<string, number> {
const vendorIdsByCompanyName = new Map<string, number>();
for (const vendor of vendors) {
const id = Number(vendor.id);
if (Number.isFinite(id) && vendor.companyName) {
vendorIdsByCompanyName.set(vendor.companyName, id);
}
}
return vendorIdsByCompanyName;
}
/** Resolves advanced-filter site keys/vendor names to API-ready board/search query params. */
export function buildResolvedBoardSearchParams(
input: ResolvedBoardSearchParamsInput,
): WorkOrderBoardSearchQueryParams | null {
const { advApplied } = input;
if (!advApplied) {
return null;
}
const siteCodes = resolveSiteCodes(advApplied.sites, input.locations);
const vendorIdsByCompanyName = buildVendorIdsByCompanyName(input.vendors);
return toBoardSearchQueryParams({
filters: { ...advApplied, sites: siteCodes },
search: input.search,
page: input.page,
pageSize: Math.min(input.pageSize || BOARD_SEARCH_MAX_PAGE_SIZE, BOARD_SEARCH_MAX_PAGE_SIZE),
sortBy: input.sortBy || "scheduledDate",
sortDir: input.sortDir || "asc",
vendorIdsByCompanyName,
});
}