56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
import { ScreenerEngine } from '../../screener/ScreenerEngine.js';
|
|
import { noopLogger } from '../utils/logger.js';
|
|
import type { AssetResult } from '../../types.js';
|
|
|
|
type AnyAsset = AssetResult['asset'] & {
|
|
getDisplayMetrics: () => Record<string, unknown>;
|
|
metrics: unknown;
|
|
};
|
|
|
|
const serializeAssets = (arr: (AssetResult & { asset: AnyAsset })[]) =>
|
|
arr.map((r) => ({
|
|
...r,
|
|
asset: {
|
|
ticker: r.asset.ticker,
|
|
type: r.asset.type,
|
|
currentPrice: r.asset.currentPrice,
|
|
metrics: r.asset.metrics,
|
|
displayMetrics: r.asset.getDisplayMetrics(),
|
|
},
|
|
}));
|
|
|
|
export default async function screenerRoutes(app: any) {
|
|
const engine = new ScreenerEngine({ logger: noopLogger });
|
|
|
|
app.post('/api/screen', {
|
|
schema: {
|
|
body: {
|
|
type: 'object',
|
|
required: ['tickers'],
|
|
properties: {
|
|
tickers: { type: 'array', items: { type: 'string' }, minItems: 1, maxItems: 50 },
|
|
},
|
|
},
|
|
},
|
|
handler: async (req: any) => {
|
|
const tickers = (req.body as { tickers: string[] }).tickers.map((t: string) =>
|
|
t.toUpperCase(),
|
|
);
|
|
const results = await engine.screenTickers(tickers);
|
|
return {
|
|
...results,
|
|
STOCK: serializeAssets(results.STOCK as any),
|
|
ETF: serializeAssets(results.ETF as any),
|
|
BOND: serializeAssets(results.BOND as any),
|
|
};
|
|
},
|
|
});
|
|
|
|
app.get('/api/screen/catalysts', async () => {
|
|
const { CatalystAnalyst } = await import('../../analyst/CatalystAnalyst.js');
|
|
const catalyst = new CatalystAnalyst({ logger: noopLogger });
|
|
const { tickers, stories } = await catalyst.run();
|
|
return { tickers, stories };
|
|
});
|
|
}
|