backend: Limitation d'appel à l'api openweathermap.org pour la fonction weatherRequest

This commit is contained in:
Divlo
2020-03-17 22:14:25 +01:00
parent 27d6531a98
commit 6a90fc764d
4 changed files with 54 additions and 6 deletions

View File

@ -1,8 +1,24 @@
const axios = require('axios');
const Queue = require('smart-request-balancer');
const sendResponse = require('../../utils/sendResponse');
const { requiredFields } = require('../../config/errors');
const { WEATHER_API_KEY } = require('../../config/config');
const queue = new Queue({
/*
rate: number of requests
per
limit: number of seconds
*/
rules: {
weatherRequest: {
rate: 50,
limit: 60,
priority: 1
},
}
});
/* OUTPUTS */
exports.weatherRequestOutput = async (res, argsObject) => {
let { cityName } = argsObject;
@ -12,8 +28,10 @@ exports.weatherRequestOutput = async (res, argsObject) => {
return sendResponse(res, requiredFields);
}
// Récupère les données météo grâce à l'API : openweathermap.org.
axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${cityName}&lang=fr&units=metric&appid=${WEATHER_API_KEY}`)
.then((response) => sendResponse(res, { result: response.data }, true))
.catch(() => sendResponse(res, { result: "La ville n'existe pas (dans l'API de openweathermap.org)." }));
// Récupère les données météo grâce à l'API : openweathermap.org. (→ avec limite de 50 requêtes par minute)
queue.request(() => {
axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${cityName}&lang=fr&units=metric&appid=${WEATHER_API_KEY}`)
.then((response) => sendResponse(res, { result: response.data }, true))
.catch(() => sendResponse(res, { result: "La ville n'existe pas (dans l'API de openweathermap.org).", httpStatus: 404 }));
}, 'everyone', 'weatherRequest');
}

View File

@ -4,7 +4,7 @@
* @param {Object} object { httpStatus, customProperties{Object}, result }
* @param {Boolean} isSuccess (false par defaut)
*/
function sendResponse (res, object, isSuccess = false) {
function sendResponse(res, object, isSuccess = false) {
res.status(object.httpStatus || 200).json({ isSuccess, ...object.customProperties, result: object.result });
}