Browse Source

feat: Refactor column definitions in AI Service to reduce redundancy

pull/5834/head
Vansh 6 days ago
parent
commit
af1c80e047
  1. 43
      apps/api/src/app/endpoints/ai/ai.service.ts

43
apps/api/src/app/endpoints/ai/ai.service.ts

@ -10,7 +10,17 @@ import type { AiPromptMode } from '@ghostfolio/common/types';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { createOpenRouter } from '@openrouter/ai-sdk-provider'; import { createOpenRouter } from '@openrouter/ai-sdk-provider';
import { generateText } from 'ai'; import { generateText } from 'ai';
import type { ColumnDescriptor } from 'tablemark'; import tablemark, { ColumnDescriptor } from 'tablemark';
// Column name constants for holdings table
const HOLDINGS_TABLE_COLUMNS = {
CURRENCY: 'Currency',
NAME: 'Name',
SYMBOL: 'Symbol',
ASSET_CLASS: 'Asset Class',
ALLOCATION_PERCENTAGE: 'Allocation in Percentage',
ASSET_SUB_CLASS: 'Asset Sub Class'
} as const;
@Injectable() @Injectable()
export class AiService { export class AiService {
@ -60,12 +70,12 @@ export class AiService {
}); });
const holdingsTableColumns: ColumnDescriptor[] = [ const holdingsTableColumns: ColumnDescriptor[] = [
{ name: 'Name' }, { name: HOLDINGS_TABLE_COLUMNS.CURRENCY },
{ name: 'Symbol' }, { name: HOLDINGS_TABLE_COLUMNS.NAME },
{ name: 'Currency' }, { name: HOLDINGS_TABLE_COLUMNS.SYMBOL },
{ name: 'Asset Class' }, { name: HOLDINGS_TABLE_COLUMNS.ASSET_CLASS },
{ name: 'Asset Sub Class' }, { align: 'right', name: HOLDINGS_TABLE_COLUMNS.ALLOCATION_PERCENTAGE },
{ align: 'right', name: 'Allocation in Percentage' } { name: HOLDINGS_TABLE_COLUMNS.ASSET_SUB_CLASS }
]; ];
const holdingsTableRows = Object.values(holdings) const holdingsTableRows = Object.values(holdings)
@ -82,23 +92,16 @@ export class AiService {
symbol symbol
}) => { }) => {
return { return {
Name: name, [HOLDINGS_TABLE_COLUMNS.CURRENCY]: currency,
Symbol: symbol, [HOLDINGS_TABLE_COLUMNS.NAME]: name,
Currency: currency, [HOLDINGS_TABLE_COLUMNS.SYMBOL]: symbol,
'Asset Class': assetClass ?? '', [HOLDINGS_TABLE_COLUMNS.ASSET_CLASS]: assetClass ?? '',
'Asset Sub Class': assetSubClass ?? '', [HOLDINGS_TABLE_COLUMNS.ALLOCATION_PERCENTAGE]: `${(allocationInPercentage * 100).toFixed(3)}%`,
'Allocation in Percentage': `${(allocationInPercentage * 100).toFixed(3)}%` [HOLDINGS_TABLE_COLUMNS.ASSET_SUB_CLASS]: assetSubClass ?? ''
}; };
} }
); );
// Dynamic import to load ESM module from CommonJS context
// eslint-disable-next-line @typescript-eslint/no-implied-eval
const dynamicImport = new Function('s', 'return import(s)') as (
s: string
) => Promise<typeof import('tablemark')>;
const { tablemark } = await dynamicImport('tablemark');
const holdingsTableString = tablemark(holdingsTableRows, { const holdingsTableString = tablemark(holdingsTableRows, {
columns: holdingsTableColumns columns: holdingsTableColumns
}); });

Loading…
Cancel
Save