From 0cf0b315dfb0c8b30396125406e2f4fbdf7a427c Mon Sep 17 00:00:00 2001 From: Boki Date: Mon, 16 Jun 2025 22:59:39 -0400 Subject: [PATCH] initial symbols done, not liking the outcome, gonna switch to queue based approach --- apps/data-service/src/providers/ib.tasks.ts | 2 +- .../data-service/src/providers/qm.provider.ts | 5 ++-- apps/data-service/src/providers/qm.tasks.ts | 24 ++++++++++++++++++- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/apps/data-service/src/providers/ib.tasks.ts b/apps/data-service/src/providers/ib.tasks.ts index 5a4a2a8..740e531 100644 --- a/apps/data-service/src/providers/ib.tasks.ts +++ b/apps/data-service/src/providers/ib.tasks.ts @@ -157,7 +157,7 @@ export async function fetchExchanges(sessionHeaders: Record): Pr logger.info('Saving IB exchanges to MongoDB...'); const client = getMongoDBClient(); - await client.batchUpsert('ib_exchanges', exchanges, ['id', 'country_code']); + await client.batchUpsert('ibExchanges', exchanges, ['id', 'country_code']); logger.info('✅ Exchange IB data saved to MongoDB:', { count: exchanges.length, }); diff --git a/apps/data-service/src/providers/qm.provider.ts b/apps/data-service/src/providers/qm.provider.ts index 5e82c26..599bf92 100644 --- a/apps/data-service/src/providers/qm.provider.ts +++ b/apps/data-service/src/providers/qm.provider.ts @@ -55,9 +55,10 @@ export function initializeQMProvider() { type: 'search-symbols', operation: 'search-symbols', payload: {}, - cronPattern: '*/1 * * * *', // Every minute + cronPattern: '0 0 * * 0', // Every minute priority: 10, - immediately: false, + immediately: true, + delay: 100000, // Delay to allow sessions to be ready description: 'Comprehensive symbol search using QM API', }, ], diff --git a/apps/data-service/src/providers/qm.tasks.ts b/apps/data-service/src/providers/qm.tasks.ts index 6c482f3..9932c62 100644 --- a/apps/data-service/src/providers/qm.tasks.ts +++ b/apps/data-service/src/providers/qm.tasks.ts @@ -1,5 +1,6 @@ import { getRandomUserAgent } from '@stock-bot/http'; import { getLogger } from '@stock-bot/logger'; +import { getMongoDBClient } from '@stock-bot/mongodb-client'; import { SymbolSearchUtil } from '../utils/symbol-search.util'; import { getProxy } from './webshare.provider'; @@ -15,6 +16,7 @@ export interface QMSession { failedCalls: number; lastUsed: Date; } + function getQmHeaders(): Record { return { 'User-Agent': getRandomUserAgent(), @@ -71,7 +73,7 @@ export async function createSessions(): Promise { ); } - while (sessionCache[sessionId].length < 5) { + while (sessionCache[sessionId].length < 50) { logger.info(`Creating new session for ${sessionId}`); const proxy = getProxy(); if (proxy === null) { @@ -151,11 +153,31 @@ async function searchQMSymbolsAPI(query: string): Promise { } const symbols = await response.json(); + const client = getMongoDBClient(); + await client.batchUpsert('qmSymbols', symbols, ['symbol', 'exchange']); + const exchanges: any[] = []; + for (const symbol of symbols) { + if (!exchanges.some(ex => ex.exchange === symbol.exchange)) { + exchanges.push({ + exchange: symbol.exchange, + exchangeCode: symbol.exchangeCode, + exchangeShortName: symbol.exchangeShortName, + countryCode: symbol.countryCode, + }); + } + } + await client.batchUpsert('qmExchanges', exchanges, ['exchange']); + session.successfulCalls++; + session.lastUsed = new Date(); logger.info(`QM API returned ${symbols.length} symbols for query: ${query}`); return symbols; } catch (error) { logger.error(`Error searching QM symbols for query "${query}":`, error); + if (session) { + session.failedCalls++; + session.lastUsed = new Date(); + } throw error; } }