Módulo para buscar preços de mercado atuais via APIs externas.
Fornecer preços de mercado atualizados para cálculo correto de Gain/Loss no Wealth Tracker, sem alterar schemas existentes.
src/market-price/
├── market-price.module.ts # Módulo NestJS
├── market-price.service.ts # Lógica de busca e cache
├── market-price.resolver.ts # GraphQL resolver
├── dto/
│ └── market-price.dto.ts # DTOs e tipos
└── README.md # Esta documentação
npm install @nestjs/axios axios
Adicione ao .env:
MARKET_DATA_API_KEY=sua_api_key_aqui
// app.module.ts
import { MarketPriceModule } from './market-price/market-price.module';
@Module({
imports: [
// ... outros módulos
MarketPriceModule,
],
})
export class AppModule {}
query {
marketPrices(tickers: ["AAPL", "SP500", "BTC"]) {
ticker
price
currency
source
fetchedAt
}
}
query {
marketPrice(ticker: "AAPL") {
ticker
price
currency
source
fetchedAt
}
}
import { MarketPriceService } from '../market-price/market-price.service';
@Injectable()
export class PortfolioService {
constructor(private marketPriceService: MarketPriceService) {}
async calculateMarketValue(portfolioId: number) {
// Buscar tickers do portfolio
const tickers = ['AAPL', 'MSFT'];
// Buscar preços atuais
const prices = await this.marketPriceService.getPrices(tickers);
// Usar preços para cálculos
// ...
}
}
O cache padrão é de 10 minutos. Para alterar, modifique DEFAULT_TTL_MS em market-price.service.ts:
private readonly DEFAULT_TTL_MS = 15 * 60 * 1000; // 15 minutos
Atualmente implementado para Yahoo Finance via RapidAPI. Para adicionar outros providers:
fetchFromPolygon())getPriceForTicker()MarketPriceSource enumdescribe('MarketPriceService', () => {
it('should fetch prices from API', async () => {
const prices = await service.getPrices(['AAPL']);
expect(prices).toHaveLength(1);
expect(prices[0].ticker).toBe('AAPL');
expect(prices[0].price).toBeGreaterThan(0);
});
it('should use cache on second call', async () => {
await service.getPrices(['AAPL']);
const cached = await service.getPrices(['AAPL']);
// Verificar que não fez nova chamada HTTP
});
});