import { buildDerivativesDashboardRequest, type ChartWindow, } from './derivativesDashboardConfig'; import type { DerivativesInterval, DetailResponse, DetailRow, PriceResponse, PriceRow, SummaryResponse, } from './derivativesViewModel'; export interface DerivativesDashboardClient { get(url: string): Promise; post(url: string, body: object): Promise; } export interface DerivativesDashboardData { summary: SummaryResponse; detailsBySymbol: Record; pricesBySymbol: Record; chartWindow: ChartWindow; } export const loadDerivativesDashboardData = async ({ hours, selectedInterval, client, now, }: { hours: string; selectedInterval: DerivativesInterval; client: DerivativesDashboardClient; now?: number; }): Promise => { const request = buildDerivativesDashboardRequest({ hours, selectedInterval, now, }); const [summary, details] = await Promise.all([ client.get(request.summaryPath), Promise.all( request.details.map(async (detailRequest) => { const [derivativesResponse, priceResponse] = await Promise.all([ client.get(detailRequest.derivativesPath), client.post( detailRequest.pricePath, detailRequest.priceBody, ), ]); return [ detailRequest.symbol, { detailRows: derivativesResponse.rows, priceRows: priceResponse.data ?? [], }, ] as const; }), ), ]); return { summary, detailsBySymbol: Object.fromEntries( details.map(([symbol, payload]) => [symbol, payload.detailRows]), ), pricesBySymbol: Object.fromEntries( details.map(([symbol, payload]) => [symbol, payload.priceRows]), ), chartWindow: request.chartWindow, }; };