33 lines
794 B
JavaScript
33 lines
794 B
JavaScript
const cache = new Map();
|
|
const expiresIn = 30000; // in milliseconds
|
|
|
|
async function getPrice(fiat) {
|
|
fiat ??= 'USD';
|
|
if (cache.has(fiat)) {
|
|
const { price, createdAt } = cache.get(fiat)
|
|
const expired = createdAt + expiresIn < Date.now()
|
|
if (!expired) {
|
|
return price;
|
|
}
|
|
}
|
|
const url = `https://api.coinbase.com/v2/prices/BTC-${fiat}/spot`;
|
|
const price = await fetch(url)
|
|
.then((res) => res.json())
|
|
.then((body) => parseFloat(body.data.amount))
|
|
.catch((err) => {
|
|
console.error(err);
|
|
return -1;
|
|
});
|
|
cache.set(fiat, { price, createdAt: Date.now() });
|
|
return price;
|
|
}
|
|
|
|
export default {
|
|
Query: {
|
|
price: async (parent, { fiatCurrency }, ctx) => {
|
|
const price = await getPrice(fiatCurrency);
|
|
return price;
|
|
},
|
|
},
|
|
};
|