const axios = require('axios') const Queue = require('smart-request-balancer') const errorHandling = require('../../utils/errorHandling') const { requiredFields } = require('../../config/errors') const { WEATHER_API_KEY } = require('../../config/config') const dateTimeUTC = require('../secondary/dateTimeManagement') const capitalize = require('../secondary/capitalize') const queue = new Queue({ /* rate: number of requests per limit: number of seconds */ rules: { weatherRequest: { rate: 50, limit: 60, priority: 1 } } }) /* OUTPUTS */ module.exports = ({ res, next }, argsObject) => { let { cityName } = argsObject // S'il n'y a pas les champs obligatoire if (!cityName) { return errorHandling(next, requiredFields) } cityName = cityName.split(' ').join('+') // 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 => { const json = response.data const showDateTimeValue = dateTimeUTC( (json.timezone / 60 / 60).toString() ).showDateTimeValue const resultHTML = `

🌎 Position : ${ json.name }, ${ json.sys.country }
⏰ Date et heure : ${showDateTimeValue}
☁️ Météo : ${capitalize( json.weather[0].description )}
🌡️ Température : ${json.main.temp} °C
💧 Humidité : ${ json.main.humidity }%

` return res.status(200).json({ result: json, resultHTML }) }) .catch(() => errorHandling(next, { message: "La ville n'existe pas (dans l'API de openweathermap.org).", statusCode: 404 }) ) }, 'everyone', 'weatherRequest' ) }