diff --git a/CLAUDE.md b/CLAUDE.md index 648162c..9269ac8 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -74,11 +74,11 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co **Service Structure**: - Each service has `src/index.ts` as entry point - Routes in `src/routes/` using Hono framework -- Providers/services in `src/providers/` or `src/services/` +- Handlers/services in `src/handlers/` or `src/services/` - Use dependency injection pattern **Data Processing**: -- Raw data → QuestDB via providers +- Raw data → QuestDB via handlers - Processed data → PostgreSQL via processing service - Event-driven communication via Dragonfly - Queue-based batch processing for large datasets diff --git a/apps/data-service/src/providers/exchange-sync.provider.ts b/apps/data-service/src/handlers/exchange-sync/exchange-sync.handler.ts similarity index 100% rename from apps/data-service/src/providers/exchange-sync.provider.ts rename to apps/data-service/src/handlers/exchange-sync/exchange-sync.handler.ts diff --git a/apps/data-service/src/providers/ib.provider.ts b/apps/data-service/src/handlers/ib/ib.handler.ts similarity index 95% rename from apps/data-service/src/providers/ib.provider.ts rename to apps/data-service/src/handlers/ib/ib.handler.ts index fd47e14..31dbecb 100644 --- a/apps/data-service/src/providers/ib.provider.ts +++ b/apps/data-service/src/handlers/ib/ib.handler.ts @@ -20,14 +20,14 @@ export function initializeIBProvider() { 'fetch-session': createJobHandler(async () => { // payload contains session configuration (not used in current implementation) logger.debug('Processing session fetch request'); - const { fetchSession } = await import('./ib.tasks'); + const { fetchSession } = await import('./ib.operations'); return fetchSession(); }), 'fetch-exchanges': createJobHandler(async () => { // payload should contain session headers logger.debug('Processing exchanges fetch request'); - const { fetchSession, fetchExchanges } = await import('./ib.tasks'); + const { fetchSession, fetchExchanges } = await import('./ib.operations'); const sessionHeaders = await fetchSession(); if (sessionHeaders) { return fetchExchanges(sessionHeaders); @@ -38,7 +38,7 @@ export function initializeIBProvider() { 'fetch-symbols': createJobHandler(async () => { // payload should contain session headers logger.debug('Processing symbols fetch request'); - const { fetchSession, fetchSymbols } = await import('./ib.tasks'); + const { fetchSession, fetchSymbols } = await import('./ib.operations'); const sessionHeaders = await fetchSession(); if (sessionHeaders) { return fetchSymbols(sessionHeaders); @@ -49,7 +49,7 @@ export function initializeIBProvider() { 'ib-exchanges-and-symbols': createJobHandler(async () => { // Legacy operation for scheduled jobs logger.info('Fetching symbol summary from IB'); - const { fetchSession, fetchExchanges, fetchSymbols } = await import('./ib.tasks'); + const { fetchSession, fetchExchanges, fetchSymbols } = await import('./ib.operations'); const sessionHeaders = await fetchSession(); logger.info('Fetched symbol summary from IB'); diff --git a/apps/data-service/src/providers/ib.tasks.ts b/apps/data-service/src/handlers/ib/ib.operations.ts similarity index 100% rename from apps/data-service/src/providers/ib.tasks.ts rename to apps/data-service/src/handlers/ib/ib.operations.ts diff --git a/apps/data-service/src/providers/proxy.provider.ts b/apps/data-service/src/handlers/proxy/proxy.handler.ts similarity index 97% rename from apps/data-service/src/providers/proxy.provider.ts rename to apps/data-service/src/handlers/proxy/proxy.handler.ts index 289ce82..f0a5fc5 100644 --- a/apps/data-service/src/providers/proxy.provider.ts +++ b/apps/data-service/src/handlers/proxy/proxy.handler.ts @@ -18,7 +18,7 @@ export function initializeProxyProvider() { 'fetch-from-sources': createJobHandler(async () => { // Fetch proxies from all configured sources logger.info('Processing fetch proxies from sources request'); - const { fetchProxiesFromSources } = await import('./proxy.tasks'); + const { fetchProxiesFromSources } = await import('./proxy.operations'); const { processItems } = await import('@stock-bot/queue'); // Fetch all proxies from sources @@ -65,7 +65,7 @@ export function initializeProxyProvider() { logger.debug('Processing proxy check request', { proxy: `${payload.host}:${payload.port}`, }); - const { checkProxy } = await import('./proxy.tasks'); + const { checkProxy } = await import('./proxy.operations'); return checkProxy(payload); }), }, diff --git a/apps/data-service/src/providers/proxy.tasks.ts b/apps/data-service/src/handlers/proxy/proxy.operations.ts similarity index 100% rename from apps/data-service/src/providers/proxy.tasks.ts rename to apps/data-service/src/handlers/proxy/proxy.operations.ts diff --git a/apps/data-service/src/providers/qm.provider.ts b/apps/data-service/src/handlers/qm/qm.handler.ts similarity index 91% rename from apps/data-service/src/providers/qm.provider.ts rename to apps/data-service/src/handlers/qm/qm.handler.ts index be80fdc..f71945c 100644 --- a/apps/data-service/src/providers/qm.provider.ts +++ b/apps/data-service/src/handlers/qm/qm.handler.ts @@ -4,7 +4,7 @@ import { handlerRegistry, type HandlerConfigWithSchedule } from '@stock-bot/queue'; -import type { SymbolSpiderJob } from './qm.tasks'; +import type { SymbolSpiderJob } from './qm.operations'; const logger = getLogger('qm-provider'); @@ -17,14 +17,14 @@ export function initializeQMProvider() { operations: { 'create-sessions': createJobHandler(async () => { logger.debug('Creating QM sessions...'); - const { createSessions } = await import('./qm.tasks'); + const { createSessions } = await import('./qm.operations'); await createSessions(); logger.debug('QM sessions created successfully'); return { success: true, message: 'QM sessions created successfully' }; }), 'search-symbols': createJobHandler(async () => { logger.info('Starting QM symbol search...'); - const { fetchSymbols } = await import('./qm.tasks'); + const { fetchSymbols } = await import('./qm.operations'); const symbols = await fetchSymbols(); if (symbols && symbols.length > 0) { @@ -46,7 +46,7 @@ export function initializeQMProvider() { }), 'spider-symbol-search': createJobHandler(async (payload: SymbolSpiderJob) => { logger.debug('Processing spider symbol search job', { payload }); - const { spiderSymbolSearch } = await import('./qm.tasks'); + const { spiderSymbolSearch } = await import('./qm.operations'); const result = await spiderSymbolSearch(payload); logger.debug('Spider search job completed', { diff --git a/apps/data-service/src/providers/qm.tasks.ts b/apps/data-service/src/handlers/qm/qm.operations.ts similarity index 100% rename from apps/data-service/src/providers/qm.tasks.ts rename to apps/data-service/src/handlers/qm/qm.operations.ts diff --git a/apps/data-service/src/providers/webshare.provider.ts b/apps/data-service/src/handlers/webshare/webshare.handler.ts similarity index 99% rename from apps/data-service/src/providers/webshare.provider.ts rename to apps/data-service/src/handlers/webshare/webshare.handler.ts index 09d1dad..edd6dbe 100644 --- a/apps/data-service/src/providers/webshare.provider.ts +++ b/apps/data-service/src/handlers/webshare/webshare.handler.ts @@ -21,7 +21,7 @@ export function initializeWebShareProvider() { operations: { 'fetch-proxies': createJobHandler(async () => { logger.info('Fetching proxies from WebShare API'); - const { fetchWebShareProxies } = await import('./webshare.tasks'); + const { fetchWebShareProxies } = await import('./webshare.operations'); try { const proxies = await fetchWebShareProxies(); diff --git a/apps/data-service/src/providers/webshare.tasks.ts b/apps/data-service/src/handlers/webshare/webshare.operations.ts similarity index 100% rename from apps/data-service/src/providers/webshare.tasks.ts rename to apps/data-service/src/handlers/webshare/webshare.operations.ts diff --git a/apps/data-service/src/index.ts b/apps/data-service/src/index.ts index 95a8fdb..b026b20 100644 --- a/apps/data-service/src/index.ts +++ b/apps/data-service/src/index.ts @@ -129,13 +129,13 @@ async function initializeServices() { await ProxyManager.initialize(); logger.info('Proxy manager initialized'); - // Initialize providers (register handlers and scheduled jobs) - logger.debug('Initializing data providers...'); - const { initializeWebShareProvider } = await import('./providers/webshare.provider'); - const { initializeExchangeSyncProvider } = await import('./providers/exchange-sync.provider'); - const { initializeIBProvider } = await import('./providers/ib.provider'); - const { initializeProxyProvider } = await import('./providers/proxy.provider'); - const { initializeQMProvider } = await import('./providers/qm.provider'); + // Initialize handlers (register handlers and scheduled jobs) + logger.debug('Initializing data handlers...'); + const { initializeWebShareProvider } = await import('./handlers/webshare/webshare.handler'); + const { initializeExchangeSyncProvider } = await import('./handlers/exchange-sync/exchange-sync.handler'); + const { initializeIBProvider } = await import('./handlers/ib/ib.handler'); + const { initializeProxyProvider } = await import('./handlers/proxy/proxy.handler'); + const { initializeQMProvider } = await import('./handlers/qm/qm.handler'); initializeWebShareProvider(); initializeExchangeSyncProvider(); @@ -143,7 +143,7 @@ async function initializeServices() { initializeProxyProvider(); initializeQMProvider(); - logger.info('Data providers initialized'); + logger.info('Data handlers initialized'); // Create scheduled jobs from registered handlers logger.debug('Creating scheduled jobs from registered handlers...');