Files
Neon-Desk/lib/query/options.ts
francy51 db01f207a5 Expand financials surfaces with ratios, KPIs, and cadence support
- Add bundled financial modeling pipeline (ratios, KPI dimensions/notes, trend series, standardization)
- Introduce company financial bundles storage (Drizzle migration + repo wiring)
- Refactor financials page/API/query flow to use surfaceKind + cadence and new response shapes
2026-03-07 15:16:35 -05:00

164 lines
4.1 KiB
TypeScript

import { queryOptions } from '@tanstack/react-query';
import {
getCompanyAiReport,
getCompanyAnalysis,
getCompanyFinancialStatements,
getLatestPortfolioInsight,
getPortfolioSummary,
getTask,
getTaskTimeline,
listFilings,
listHoldings,
listRecentTasks,
listResearchJournal,
listWatchlist
} from '@/lib/api';
import { queryKeys } from '@/lib/query/keys';
import type {
FinancialCadence,
FinancialSurfaceKind
} from '@/lib/types';
export function companyAnalysisQueryOptions(ticker: string) {
const normalizedTicker = ticker.trim().toUpperCase();
return queryOptions({
queryKey: queryKeys.companyAnalysis(normalizedTicker),
queryFn: () => getCompanyAnalysis(normalizedTicker),
staleTime: 120_000
});
}
export function companyFinancialStatementsQueryOptions(input: {
ticker: string;
surfaceKind: FinancialSurfaceKind;
cadence: FinancialCadence;
includeDimensions?: boolean;
includeFacts?: boolean;
factsCursor?: string | null;
factsLimit?: number;
cursor?: string | null;
limit?: number;
}) {
const normalizedTicker = input.ticker.trim().toUpperCase();
const includeDimensions = input.includeDimensions ?? false;
const includeFacts = input.includeFacts ?? false;
const factsCursor = input.factsCursor ?? null;
const factsLimit = input.factsLimit ?? 500;
const cursor = input.cursor ?? null;
const limit = input.limit ?? 40;
return queryOptions({
queryKey: queryKeys.companyFinancialStatements(
normalizedTicker,
input.surfaceKind,
input.cadence,
includeDimensions,
includeFacts,
factsCursor,
factsLimit,
cursor,
limit
),
queryFn: () => getCompanyFinancialStatements({
ticker: normalizedTicker,
surfaceKind: input.surfaceKind,
cadence: input.cadence,
includeDimensions,
includeFacts,
factsCursor,
factsLimit,
cursor,
limit
}),
staleTime: 60_000
});
}
export function filingsQueryOptions(input: { ticker?: string; limit?: number } = {}) {
const normalizedTicker = input.ticker?.trim().toUpperCase() ?? null;
const limit = input.limit ?? 120;
return queryOptions({
queryKey: queryKeys.filings(normalizedTicker, limit),
queryFn: () => listFilings({ ticker: normalizedTicker ?? undefined, limit }),
staleTime: 60_000
});
}
export function aiReportQueryOptions(accessionNumber: string) {
const normalizedAccession = accessionNumber.trim();
return queryOptions({
queryKey: queryKeys.report(normalizedAccession),
queryFn: () => getCompanyAiReport(normalizedAccession),
staleTime: 300_000
});
}
export function watchlistQueryOptions() {
return queryOptions({
queryKey: queryKeys.watchlist(),
queryFn: () => listWatchlist(),
staleTime: 30_000
});
}
export function researchJournalQueryOptions(ticker: string) {
const normalizedTicker = ticker.trim().toUpperCase();
return queryOptions({
queryKey: queryKeys.researchJournal(normalizedTicker),
queryFn: () => listResearchJournal(normalizedTicker),
staleTime: 15_000
});
}
export function holdingsQueryOptions() {
return queryOptions({
queryKey: queryKeys.holdings(),
queryFn: () => listHoldings(),
staleTime: 30_000
});
}
export function portfolioSummaryQueryOptions() {
return queryOptions({
queryKey: queryKeys.portfolioSummary(),
queryFn: () => getPortfolioSummary(),
staleTime: 30_000
});
}
export function latestPortfolioInsightQueryOptions() {
return queryOptions({
queryKey: queryKeys.latestPortfolioInsight(),
queryFn: () => getLatestPortfolioInsight(),
staleTime: 30_000
});
}
export function taskQueryOptions(taskId: string) {
return queryOptions({
queryKey: queryKeys.task(taskId),
queryFn: () => getTask(taskId),
staleTime: 5_000
});
}
export function taskTimelineQueryOptions(taskId: string) {
return queryOptions({
queryKey: queryKeys.taskTimeline(taskId),
queryFn: () => getTaskTimeline(taskId),
staleTime: 5_000
});
}
export function recentTasksQueryOptions(limit = 20) {
return queryOptions({
queryKey: queryKeys.recentTasks(limit),
queryFn: () => listRecentTasks({ limit }),
staleTime: 5_000
});
}