feat(laws,opendata): add local law storage and migrate OpenData persistence to smartdb-backed local storage
This commit is contained in:
@@ -166,7 +166,7 @@ export class FundamentalsService implements IFundamentalsProviderRegistry {
|
||||
lastError = error as Error;
|
||||
|
||||
console.warn(
|
||||
`Provider ${provider.name} failed for ${this.getRequestDescription(request)}: ${error.message}`
|
||||
`Provider ${provider.name} failed for ${this.getRequestDescription(request)}: ${plugins.getErrorMessage(error)}`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,17 @@ export class StockDataService {
|
||||
|
||||
private logger = console;
|
||||
|
||||
private config: Required<IStockDataServiceConfig> = {
|
||||
private config: {
|
||||
cache: {
|
||||
priceTTL: number;
|
||||
fundamentalsTTL: number;
|
||||
maxEntries: number;
|
||||
};
|
||||
timeout: {
|
||||
price: number;
|
||||
fundamentals: number;
|
||||
};
|
||||
} = {
|
||||
cache: {
|
||||
priceTTL: 24 * 60 * 60 * 1000, // 24 hours
|
||||
fundamentalsTTL: 90 * 24 * 60 * 60 * 1000, // 90 days
|
||||
@@ -200,7 +210,7 @@ export class StockDataService {
|
||||
entry.lastErrorTime = new Date();
|
||||
lastError = error as Error;
|
||||
|
||||
console.warn(`Provider ${provider.name} failed for ${ticker}: ${error.message}`);
|
||||
console.warn(`Provider ${provider.name} failed for ${ticker}: ${plugins.getErrorMessage(error)}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -250,7 +260,7 @@ export class StockDataService {
|
||||
entry.lastErrorTime = new Date();
|
||||
lastError = error as Error;
|
||||
|
||||
console.warn(`Provider ${provider.name} failed for batch prices: ${error.message}`);
|
||||
console.warn(`Provider ${provider.name} failed for batch prices: ${plugins.getErrorMessage(error)}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -301,7 +311,7 @@ export class StockDataService {
|
||||
entry.lastErrorTime = new Date();
|
||||
lastError = error as Error;
|
||||
|
||||
console.warn(`Provider ${provider.name} failed for ${ticker} fundamentals: ${error.message}`);
|
||||
console.warn(`Provider ${provider.name} failed for ${ticker} fundamentals: ${plugins.getErrorMessage(error)}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -352,7 +362,7 @@ export class StockDataService {
|
||||
entry.lastErrorTime = new Date();
|
||||
lastError = error as Error;
|
||||
|
||||
console.warn(`Provider ${provider.name} failed for batch fundamentals: ${error.message}`);
|
||||
console.warn(`Provider ${provider.name} failed for batch fundamentals: ${plugins.getErrorMessage(error)}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -382,7 +392,7 @@ export class StockDataService {
|
||||
fundamentals = this.enrichWithPrice(fundamentals, price.price);
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn(`Failed to fetch fundamentals for ${normalizedRequest.ticker}: ${error.message}`);
|
||||
console.warn(`Failed to fetch fundamentals for ${normalizedRequest.ticker}: ${plugins.getErrorMessage(error)}`);
|
||||
// Continue without fundamentals
|
||||
}
|
||||
}
|
||||
@@ -426,7 +436,7 @@ export class StockDataService {
|
||||
fundamentalsMap = new Map(fundamentals.map(f => [f.ticker, f]));
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn(`Failed to fetch batch fundamentals: ${error.message}`);
|
||||
console.warn(`Failed to fetch batch fundamentals: ${plugins.getErrorMessage(error)}`);
|
||||
// Continue without fundamentals
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,7 +205,7 @@ export class StockPriceService implements IProviderRegistry {
|
||||
lastError = error as Error;
|
||||
|
||||
console.warn(
|
||||
`Provider ${provider.name} failed for ${this.getRequestDescription(request)}: ${error.message}`
|
||||
`Provider ${provider.name} failed for ${this.getRequestDescription(request)}: ${plugins.getErrorMessage(error)}`
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -522,4 +522,4 @@ export class StockPriceService implements IProviderRegistry {
|
||||
ttl: ttl || this.cacheConfig.ttl
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@ export class MarketstackProvider implements IStockProvider {
|
||||
public priority = 90; // Increased from 80 - now supports real-time intraday data during market hours
|
||||
public readonly requiresAuth = true;
|
||||
public readonly rateLimit = {
|
||||
requestsPerMinute: undefined, // No per-minute limit specified
|
||||
requestsPerMinute: 0, // No per-minute limit specified
|
||||
requestsPerDay: undefined // Varies by plan
|
||||
};
|
||||
|
||||
@@ -99,8 +99,9 @@ export class MarketstackProvider implements IStockProvider {
|
||||
}
|
||||
} catch (error) {
|
||||
// If intraday fails, fallback to EOD with warning
|
||||
if (error.message?.includes('intraday') || error.message?.includes('Marketstack API error')) {
|
||||
this.logger.warn(`Intraday endpoint failed for ${request.ticker}, falling back to EOD:`, error.message);
|
||||
const errorMessage = plugins.getErrorMessage(error);
|
||||
if (errorMessage.includes('intraday') || errorMessage.includes('Marketstack API error')) {
|
||||
this.logger.warn(`Intraday endpoint failed for ${request.ticker}, falling back to EOD:`, errorMessage);
|
||||
try {
|
||||
return await this.fetchCurrentPriceEod(request);
|
||||
} catch (eodError) {
|
||||
@@ -245,7 +246,7 @@ export class MarketstackProvider implements IStockProvider {
|
||||
return allPrices;
|
||||
} catch (error) {
|
||||
this.logger.error(`Failed to fetch historical prices for ${request.ticker}:`, error);
|
||||
throw new Error(`Marketstack: Failed to fetch historical prices for ${request.ticker}: ${error.message}`);
|
||||
throw new Error(`Marketstack: Failed to fetch historical prices for ${request.ticker}: ${plugins.getErrorMessage(error)}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -337,7 +338,7 @@ export class MarketstackProvider implements IStockProvider {
|
||||
return allPrices;
|
||||
} catch (error) {
|
||||
this.logger.error(`Failed to fetch intraday prices for ${request.ticker}:`, error);
|
||||
throw new Error(`Marketstack: Failed to fetch intraday prices for ${request.ticker}: ${error.message}`);
|
||||
throw new Error(`Marketstack: Failed to fetch intraday prices for ${request.ticker}: ${plugins.getErrorMessage(error)}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -359,8 +360,9 @@ export class MarketstackProvider implements IStockProvider {
|
||||
}
|
||||
} catch (error) {
|
||||
// Fallback to EOD if intraday fails
|
||||
if (error.message?.includes('intraday') || error.message?.includes('Marketstack API error')) {
|
||||
this.logger.warn(`Intraday batch endpoint failed, falling back to EOD:`, error.message);
|
||||
const errorMessage = plugins.getErrorMessage(error);
|
||||
if (errorMessage.includes('intraday') || errorMessage.includes('Marketstack API error')) {
|
||||
this.logger.warn(`Intraday batch endpoint failed, falling back to EOD:`, errorMessage);
|
||||
try {
|
||||
return await this.fetchBatchCurrentPricesEod(request);
|
||||
} catch (eodError) {
|
||||
|
||||
@@ -141,7 +141,7 @@ export class SecEdgarProvider implements IFundamentalsProvider {
|
||||
return this.parseCompanyFacts(request.ticker, cik, companyFacts);
|
||||
} catch (error) {
|
||||
this.logger.error(`Failed to fetch fundamentals for ${request.ticker}:`, error);
|
||||
throw new Error(`SEC EDGAR: Failed to fetch fundamentals for ${request.ticker}: ${error.message}`);
|
||||
throw new Error(`SEC EDGAR: Failed to fetch fundamentals for ${request.ticker}: ${plugins.getErrorMessage(error)}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,7 +163,7 @@ export class SecEdgarProvider implements IFundamentalsProvider {
|
||||
results.push(fundamentals);
|
||||
} catch (error) {
|
||||
this.logger.warn(`Failed to fetch fundamentals for ${ticker}:`, error);
|
||||
errors.push(`${ticker}: ${error.message}`);
|
||||
errors.push(`${ticker}: ${plugins.getErrorMessage(error)}`);
|
||||
// Continue with other tickers
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@ export class YahooFinanceProvider implements IStockProvider {
|
||||
return stockPrice;
|
||||
} catch (error) {
|
||||
console.error(`Failed to fetch price for ${request.ticker}:`, error);
|
||||
throw new Error(`Yahoo Finance: Failed to fetch price for ${request.ticker}: ${error.message}`);
|
||||
throw new Error(`Yahoo Finance: Failed to fetch price for ${request.ticker}: ${plugins.getErrorMessage(error)}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -145,7 +145,7 @@ export class YahooFinanceProvider implements IStockProvider {
|
||||
return prices;
|
||||
} catch (error) {
|
||||
console.error(`Failed to fetch batch prices:`, error);
|
||||
throw new Error(`Yahoo Finance: Failed to fetch batch prices: ${error.message}`);
|
||||
throw new Error(`Yahoo Finance: Failed to fetch batch prices: ${plugins.getErrorMessage(error)}`);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,4 +191,4 @@ export class YahooFinanceProvider implements IStockProvider {
|
||||
return timeDiff > 3600 ? 'CLOSED' : 'REGULAR';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user