FunctionProject/api/assets/functions/main/weatherRequest.js

74 lines
2.3 KiB
JavaScript
Raw Normal View History

2020-08-03 12:04:07 +02:00
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({
2020-08-03 12:04:07 +02:00
/*
rate: number of requests
per
limit: number of seconds
*/
2020-08-03 12:04:07 +02:00
rules: {
weatherRequest: {
rate: 50,
limit: 60,
priority: 1
}
2020-08-03 12:04:07 +02:00
}
})
/* OUTPUTS */
2020-08-03 12:04:07 +02:00
module.exports = ({ res, next }, argsObject) => {
let { cityName } = argsObject
2020-08-03 12:04:07 +02:00
// S'il n'y a pas les champs obligatoire
2020-08-03 14:14:45 +02:00
if (!cityName) {
2020-08-03 12:04:07 +02:00
return errorHandling(next, requiredFields)
}
2020-08-03 12:04:07 +02:00
cityName = cityName.split(' ').join('+')
2020-08-03 12:04:07 +02:00
// Récupère les données météo grâce à l'API : openweathermap.org. (→ avec limite de 50 requêtes par minute)
2020-08-03 14:14:45 +02:00
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 = `<p>🌎 Position : <a href="https://www.google.com/maps/search/?api=1&query=${
json.coord.lat
},${json.coord.lon}" rel="noopener noreferrer" target="_blank">${
json.name
}, ${
json.sys.country
}</a><br/> Date et heure : ${showDateTimeValue} <br/> Météo : ${capitalize(
json.weather[0].description
)}<br/>🌡 Température : ${json.main.temp} °C<br/> 💧 Humidité : ${
json.main.humidity
}% <br/> <img src="https://openweathermap.org/img/wn/${
json.weather[0].icon
}@2x.png"/></p>`
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'
)
2020-08-03 12:04:07 +02:00
}