80 lines
3.1 KiB
TypeScript
80 lines
3.1 KiB
TypeScript
/**
|
|
* Handler initialization for data-ingestion service
|
|
* Uses explicit imports for bundling compatibility
|
|
*/
|
|
|
|
import { getLogger } from '@stock-bot/logger';
|
|
import type { IServiceContainer } from '@stock-bot/types';
|
|
// Import handlers explicitly for bundling (ensures they're included in the build)
|
|
// These imports trigger the decorator metadata to be set
|
|
import { CeoHandler } from './ceo/ceo.handler';
|
|
import { IbHandler } from './ib/ib.handler';
|
|
import { QMHandler } from './qm/qm.handler';
|
|
import { WebShareHandler } from './webshare/webshare.handler';
|
|
import { TradingViewHandler } from './tradingview/tradingview.handler';
|
|
import { TeHandler } from './te/te.handler';
|
|
import { EodHandler } from './eod/eod.handler';
|
|
|
|
// Add more handler imports as needed
|
|
|
|
const logger = getLogger('handler-init');
|
|
|
|
/**
|
|
* Initialize and register all handlers
|
|
* Note: The actual registration is now handled by the HandlerScanner in the DI container
|
|
* This function is kept for backward compatibility and explicit handler imports
|
|
*/
|
|
export async function initializeAllHandlers(serviceContainer: IServiceContainer): Promise<void> {
|
|
try {
|
|
// The HandlerScanner in the DI container will handle the actual registration
|
|
// We just need to ensure handlers are imported so their decorators run
|
|
|
|
const handlers = [CeoHandler, IbHandler, QMHandler, WebShareHandler, TradingViewHandler, TeHandler, EodHandler];
|
|
|
|
logger.info('Handler imports loaded', {
|
|
count: handlers.length,
|
|
handlers: handlers.map(h => (h as any).__handlerName || h.name),
|
|
});
|
|
|
|
// Log what metadata the handlers have
|
|
for (const HandlerClass of handlers) {
|
|
const metadata = (HandlerClass as any).__handlerMetadata;
|
|
logger.info(`Handler ${HandlerClass.name} metadata`, {
|
|
hasMetadata: !!metadata,
|
|
handlerName: metadata?.name,
|
|
operationCount: metadata?.operations?.length || 0,
|
|
scheduledJobCount: metadata?.scheduledJobs?.length || 0,
|
|
});
|
|
}
|
|
|
|
// Get the DI container from the service container
|
|
const diContainer = (serviceContainer as any)._diContainer;
|
|
|
|
if (diContainer?.resolve) {
|
|
// Get handler scanner from DI container
|
|
const scanner = diContainer.resolve('handlerScanner');
|
|
if (scanner?.registerHandlerClass) {
|
|
for (const HandlerClass of handlers) {
|
|
scanner.registerHandlerClass(HandlerClass, { serviceName: 'data-ingestion' });
|
|
}
|
|
logger.info('Handlers registered with scanner');
|
|
} else {
|
|
logger.warn('Handler scanner not found or missing registerHandlerClass method');
|
|
}
|
|
|
|
// Also check the handler registry directly
|
|
const handlerRegistry = diContainer.resolve('handlerRegistry');
|
|
if (handlerRegistry) {
|
|
logger.info('Handler registry state after registration', {
|
|
registeredHandlers: handlerRegistry.getHandlerNames(),
|
|
handlersWithSchedule: handlerRegistry.getAllHandlersWithSchedule().size,
|
|
});
|
|
}
|
|
} else {
|
|
logger.error('Could not access DI container from service container');
|
|
}
|
|
} catch (error) {
|
|
logger.error('Handler initialization failed', { error });
|
|
throw error;
|
|
}
|
|
}
|