frontend et backend: Formulaire dynamique
This commit is contained in:
@ -23,7 +23,7 @@ function armstrongNumber(number) {
|
||||
const isArmstrongNumber = (result === number);
|
||||
return {
|
||||
isArmstrongNumber,
|
||||
htmlExplanation: `${formattedNumber} ${isArmstrongNumber ? "" : "n'"}est pas un nombre d'Armstrong, car ${resultString.slice(2)} = ${formatNumberResult(result)}.`
|
||||
resultHTML: `<p>${formattedNumber} ${isArmstrongNumber ? "" : "n'"}est pas un nombre d'Armstrong, car ${resultString.slice(2)} = ${formatNumberResult(result)}.</p>`
|
||||
}
|
||||
}
|
||||
|
||||
@ -35,7 +35,7 @@ exports.armstrongNumberOutput = ({ res, next }, argsObject) => {
|
||||
if (!(number)) {
|
||||
return errorHandling(next, requiredFields);
|
||||
}
|
||||
|
||||
|
||||
// Si ce n'est pas un nombre
|
||||
number = parseInt(number);
|
||||
if (isNaN(number) || number <= 0) {
|
||||
|
@ -6,7 +6,7 @@ function calculateAge(currentDate, { birthDateDay, birthDateMonth, birthDateYear
|
||||
const day = currentDate.getDate();
|
||||
const month = currentDate.getMonth();
|
||||
const currentDateMoment = moment([currentDate.getFullYear(), month, day]);
|
||||
const birthDateMoment = moment([birthDateYear, birthDateMonth - 1, birthDateDay]);
|
||||
const birthDateMoment = moment([birthDateYear, birthDateMonth, birthDateDay]);
|
||||
|
||||
// Calcule l'âge - Moment.js
|
||||
const ageYears = currentDateMoment.diff(birthDateMoment, 'year');
|
||||
@ -15,28 +15,36 @@ function calculateAge(currentDate, { birthDateDay, birthDateMonth, birthDateYear
|
||||
birthDateMoment.add(ageMonths, 'months');
|
||||
const ageDays = currentDateMoment.diff(birthDateMoment, 'days');
|
||||
|
||||
const isBirthday = (birthDateDay === day && birthDateMonth === (month + 1));
|
||||
const isBirthday = (birthDateDay === day && birthDateMonth === month);
|
||||
return { ageYears, ageMonths, ageDays, isBirthday };
|
||||
}
|
||||
|
||||
/* OUTPUTS */
|
||||
exports.calculateAgeOutput = ({ res, next }, argsObject) => {
|
||||
let { birthDateDay, birthDateMonth, birthDateYear } = argsObject;
|
||||
birthDateDay = parseInt(birthDateDay);
|
||||
birthDateMonth = parseInt(birthDateMonth);
|
||||
birthDateYear = parseInt(birthDateYear);
|
||||
let { birthDate } = argsObject;
|
||||
|
||||
// S'il n'y a pas les champs obligatoire
|
||||
if (!(birthDateDay && birthDateMonth && birthDateYear)) {
|
||||
if (!(birthDate)) {
|
||||
return errorHandling(next, requiredFields);
|
||||
}
|
||||
|
||||
const birthDateDay = parseInt(birthDate.substring(0, 2));
|
||||
const birthDateMonth = parseInt((birthDate.substring(3, 5)) - 1);
|
||||
const birthDateYear = parseInt(birthDate.substring(6, 10));
|
||||
|
||||
// Si ce n'est pas une date valide
|
||||
const currentDate = new Date();
|
||||
const birthDate = new Date(birthDateYear, birthDateMonth - 1, birthDateDay);
|
||||
if (!(currentDate > birthDate)) {
|
||||
const currentDate = new Date();
|
||||
const birthDateObject = new Date(birthDateYear, birthDateMonth, birthDateDay);
|
||||
const result = calculateAge(currentDate, { birthDateYear, birthDateMonth, birthDateDay });
|
||||
if ((currentDate < birthDateObject) || isNaN(result.ageYears)) {
|
||||
return errorHandling(next, { message: "Veuillez rentré une date valide...", statusCode: 400 });
|
||||
}
|
||||
|
||||
return res.status(200).json(calculateAge(currentDate, { birthDateYear, birthDateMonth, birthDateDay }));
|
||||
|
||||
let resultHTML;
|
||||
if (result.isBirthday) {
|
||||
resultHTML = `<p>Vous avez ${result.ageYears} ans. Joyeux Anniversaire! 🥳</p>`;
|
||||
} else {
|
||||
resultHTML = `<p>Vous avez ${result.ageYears} ans, ${result.ageMonths} mois et ${result.ageDays} jour(s).</p>`;
|
||||
}
|
||||
return res.status(200).json({ ...result, resultHTML });
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
const axios = require('axios');
|
||||
const errorHandling = require('../../utils/errorHandling');
|
||||
const { requiredFields } = require('../../config/errors');
|
||||
const formatNumberResult = require('../secondary/formatNumberResult');
|
||||
|
||||
/* OUTPUTS */
|
||||
exports.convertCurrencyOutput = ({ res, next }, argsObject) => {
|
||||
@ -10,7 +11,7 @@ exports.convertCurrencyOutput = ({ res, next }, argsObject) => {
|
||||
if (!(number && baseCurrency && finalCurrency)) {
|
||||
return errorHandling(next, requiredFields);
|
||||
}
|
||||
|
||||
|
||||
// Si ce n'est pas un nombre
|
||||
number = parseFloat(number);
|
||||
if (isNaN(number)) {
|
||||
@ -23,12 +24,14 @@ exports.convertCurrencyOutput = ({ res, next }, argsObject) => {
|
||||
if (!rate) {
|
||||
return errorHandling(next, { message: "La devise n'existe pas.", statusCode: 404 });
|
||||
}
|
||||
const result = rate * number;
|
||||
const result = rate * number;
|
||||
const dateObject = new Date(response.data.date);
|
||||
const year = dateObject.getFullYear();
|
||||
const day = ('0'+(dateObject.getDate())).slice(-2);
|
||||
const month = ('0'+(dateObject.getMonth()+1)).slice(-2);
|
||||
return res.status(200).json({ date: `${day}/${month}/${year}`, result });
|
||||
const year = dateObject.getFullYear();
|
||||
const day = ('0'+(dateObject.getDate())).slice(-2);
|
||||
const month = ('0'+(dateObject.getMonth()+1)).slice(-2);
|
||||
const date = `${day}/${month}/${year}`;
|
||||
const resultHTML = `<p>${formatNumberResult(number)} ${response.data.base} = ${formatNumberResult(result).toFixed(2)} ${finalCurrency}</p><p>Dernier rafraîchissement du taux d'échange : ${data}</p>`;
|
||||
return res.status(200).json({ date, result, resultHTML });
|
||||
})
|
||||
.catch(() => errorHandling(next, { message: "La devise n'existe pas.", statusCode: 404 }));
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
const errorHandling = require('../../utils/errorHandling');
|
||||
const { requiredFields, generalError } = require('../../config/errors');
|
||||
const formatNumberResult = require('../secondary/formatNumberResult');
|
||||
|
||||
const correspondancesDistance = ["pm", null, null, "nm", null, null, "µm", null, null, "mm", "cm", "dm", "m", "dam", "hm", "km", null, null, "Mm", null, null, "Gm", null, null, "Tm"];
|
||||
|
||||
@ -19,8 +20,8 @@ function convertDistance(firstValue, unitFirstValue, unitFinalValue) {
|
||||
const difference = index1 - index2;
|
||||
const result = firstValue * Math.pow(10, difference);
|
||||
return {
|
||||
resultNumber: result,
|
||||
resultString: `${result} ${unitFinalValue}`
|
||||
result,
|
||||
resultHTML: `<p>Conversion de longueur : ${formatNumberResult(firstValue)} ${unitFirstValue} = ${formatNumberResult(result)} ${unitFinalValue}</p>`
|
||||
};
|
||||
}
|
||||
return false;
|
||||
@ -34,7 +35,7 @@ exports.convertDistanceOutput = ({ res, next }, argsObject) => {
|
||||
if (!(number && numberUnit && finalUnit)) {
|
||||
return errorHandling(next, requiredFields);
|
||||
}
|
||||
|
||||
|
||||
// Si ce n'est pas un nombre
|
||||
number = parseInt(number);
|
||||
if (isNaN(number)) {
|
||||
|
@ -239,5 +239,5 @@ exports.convertEncodingOutput = ({ res, next }, argsObject) => {
|
||||
return errorHandling(next, generalError);
|
||||
}
|
||||
|
||||
return res.status(200).json({ result });
|
||||
return res.status(200).json({ result, resultHTML: `<p>${result}</p>` });
|
||||
}
|
@ -76,12 +76,7 @@ exports.convertRomanToArabicOutput = ({ res, next }, argsObject) => {
|
||||
}
|
||||
|
||||
// Formate le paramètre
|
||||
try {
|
||||
romanNumber = romanNumber.toUpperCase();
|
||||
}
|
||||
catch {
|
||||
return errorHandling(next, generalError);
|
||||
}
|
||||
romanNumber = romanNumber.toUpperCase();
|
||||
|
||||
const result = convertRomanToArabic(romanNumber);
|
||||
if (result === 0) {
|
||||
|
@ -1,36 +1,34 @@
|
||||
const errorHandling = require('../../utils/errorHandling');
|
||||
const { requiredFields, generalError } = require('../../config/errors');
|
||||
const formatNumberResult = require('../secondary/formatNumberResult');
|
||||
|
||||
/**
|
||||
* @description Convertis des °C en °F et l'inverse aussi.
|
||||
* @param {Number} degree - Nombre de degrès
|
||||
* @param {String} unit - Unité du nombre (°C ou °F)
|
||||
* @param {String} unit - Unité du nombre (°C ou °F) après conversion
|
||||
* @returns {Object} false si arguments non valides et sinon un objet contenant la string et le nombre résultat
|
||||
* @examples convertTemperature(23, '°C') → { resultNumber: 73.4, resultString: "73.4 °F" }
|
||||
* @examples convertTemperature(23, '°C') → { result: 73.4, resultHTML: "73.4 °F" }
|
||||
*/
|
||||
function convertTemperature(degree, unit) {
|
||||
let temperatureValue = 0;
|
||||
let temperatureUnit;
|
||||
if (unit === "°C") {
|
||||
temperatureUnit = "°F";
|
||||
temperatureValue = ((degree * 9/5) + 32);
|
||||
temperatureValue = (degree - 32) * 5/9;
|
||||
}
|
||||
else if (unit === "°F") {
|
||||
temperatureUnit = "°C";
|
||||
temperatureValue = (degree - 32) * 5/9;
|
||||
temperatureValue = ((degree * 9/5) + 32);
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
return {
|
||||
resultNumber: temperatureValue,
|
||||
resultString: `${temperatureValue} ${temperatureUnit}`
|
||||
result: temperatureValue,
|
||||
resultHTML: `<p>${formatNumberResult(temperatureValue)} ${unit}</p>`
|
||||
};
|
||||
}
|
||||
|
||||
/* OUTPUTS */
|
||||
exports.convertTemperatureOutput = ({ res, next }, argsObject) => {
|
||||
let { degree, unit } = argsObject;
|
||||
let { degree, unitToConvert } = argsObject;
|
||||
|
||||
// S'il n'y a pas les champs obligatoire
|
||||
if (!(degree && unit)) {
|
||||
@ -43,7 +41,7 @@ exports.convertTemperatureOutput = ({ res, next }, argsObject) => {
|
||||
return errorHandling(next, { message: "Veuillez rentré un nombre valide.", statusCode: 400 });
|
||||
}
|
||||
|
||||
const result = convertTemperature(degree, unit);
|
||||
const result = convertTemperature(degree, unitToConvert);
|
||||
if (!result) {
|
||||
return errorHandling(next, generalError);
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
const errorHandling = require('../../utils/errorHandling');
|
||||
const { requiredFields } = require('../../config/errors');
|
||||
const formatNumberResult = require('../secondary/formatNumberResult');
|
||||
|
||||
/**
|
||||
* @description Retourne un tableau contenant toutes les possibilités d'anagramme d'un mot.
|
||||
@ -36,11 +37,16 @@ exports.heapAlgorithmOutput = ({ res, next }, argsObject) => {
|
||||
}
|
||||
|
||||
// Si la chaîne de caractère dépasse LIMIT_CHARACTERS caractères
|
||||
const LIMIT_CHARACTERS = 8;
|
||||
const LIMIT_CHARACTERS = 7;
|
||||
if (string.length > LIMIT_CHARACTERS) {
|
||||
return errorHandling(next, { message: `Par souci de performance, vous ne pouvez pas exécuter cette fonction avec un mot dépassant ${LIMIT_CHARACTERS} caractères.`, statusCode: 400 });
|
||||
}
|
||||
|
||||
const result = heapAlgorithm(string);
|
||||
return res.status(200).json(result);
|
||||
let resultHTML = `<p>Il y a ${formatNumberResult(result.length)} possibilités d'anagramme pour le mot "${string}" qui contient ${string.length} caractères, la liste : <br/><br/>`;
|
||||
result.forEach((string) => {
|
||||
resultHTML += string + "<br/>";
|
||||
});
|
||||
resultHTML += "</p>";
|
||||
return res.status(200).json({ result, resultHTML });
|
||||
}
|
@ -1,5 +1,6 @@
|
||||
const errorHandling = require('../../utils/errorHandling');
|
||||
const { requiredFields } = require('../../config/errors');
|
||||
const formatNumberResult = require('../secondary/formatNumberResult');
|
||||
|
||||
/**
|
||||
* @description Génère un nombre aléatoire entre un minimum inclus et un maximum inclus.
|
||||
@ -28,5 +29,6 @@ exports.randomNumberOutput = ({ res, next }, argsObject) => {
|
||||
return errorHandling(next, { message: "Les paramètres min et max doivent être des nombres...", statusCode: 400 });
|
||||
}
|
||||
|
||||
return res.status(200).json({ result: randomNumber(min, max) });
|
||||
const result = randomNumber(min, max);
|
||||
return res.status(200).json({ result, resultHTML: `<p>${formatNumberResult(result)}</p>` });
|
||||
}
|
@ -3,6 +3,8 @@ 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({
|
||||
/*
|
||||
@ -20,7 +22,7 @@ const queue = new Queue({
|
||||
});
|
||||
|
||||
/* OUTPUTS */
|
||||
exports.weatherRequestOutput = async ({ res, next }, argsObject) => {
|
||||
exports.weatherRequestOutput = ({ res, next }, argsObject) => {
|
||||
let { cityName } = argsObject;
|
||||
|
||||
// S'il n'y a pas les champs obligatoire
|
||||
@ -28,10 +30,17 @@ exports.weatherRequestOutput = async ({ res, next }, argsObject) => {
|
||||
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) => res.status(200).json(response.data))
|
||||
.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');
|
||||
}
|
12
api/assets/functions/secondary/capitalize.js
Normal file
12
api/assets/functions/secondary/capitalize.js
Normal file
@ -0,0 +1,12 @@
|
||||
/**
|
||||
* @description Majuscule à la 1ère lettre d'une string.
|
||||
* @param {String} s
|
||||
* @returns {String}
|
||||
* @examples capitalize('hello world!') → 'Hello world!'
|
||||
*/
|
||||
function capitalize(s) {
|
||||
if (typeof s !== 'string') return ''
|
||||
return s.charAt(0).toUpperCase() + s.slice(1)
|
||||
}
|
||||
|
||||
module.exports = capitalize;
|
45
api/assets/functions/secondary/dateTimeManagement.js
Normal file
45
api/assets/functions/secondary/dateTimeManagement.js
Normal file
@ -0,0 +1,45 @@
|
||||
const timeNow = new Date();
|
||||
const utcOffset = timeNow.getTimezoneOffset();
|
||||
timeNow.setMinutes(timeNow.getMinutes() + utcOffset);
|
||||
|
||||
/**
|
||||
* @description Donne la date et l'heure selon l'UTC (Universal Time Coordinated).
|
||||
* @param {String} utc Heure de décalage par rapport à l'UTC
|
||||
* @returns {Function} → showDateTime(enteredOffset) → Retourne l'exécution de la fonction showDateTime
|
||||
* @examples dateTimeUTC('0')
|
||||
*/
|
||||
function dateTimeUTC(utc) {
|
||||
const enteredOffset = parseFloat(utc)*60;
|
||||
timeNow.setMinutes(timeNow.getMinutes() + enteredOffset);
|
||||
return showDateTime(enteredOffset);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Affiche la date et l'heure (format : dd/mm/yyyy - 00:00:00).
|
||||
* @requires {@link fonctions_annexes.js: showDateTime}
|
||||
* @param {String} utc Heure de décalage par rapport à l'UTC
|
||||
* @returns {Object} Retourne un objet contenant l'année, le mois, le jour, l'heure, les minutes, les secondes et la date formaté
|
||||
* @examples dateTimeUTC('0') → dateTimeUTC vous renvoie l'exécution de showDateTime
|
||||
*/
|
||||
function showDateTime(enteredOffset) {
|
||||
const year = timeNow.getFullYear();
|
||||
const month = ('0'+(timeNow.getMonth()+1)).slice(-2);
|
||||
const day = ('0'+timeNow.getDate()).slice(-2);
|
||||
const hour = ('0'+timeNow.getHours()).slice(-2);
|
||||
const minute = ('0'+timeNow.getMinutes()).slice(-2);
|
||||
const second = ('0'+timeNow.getSeconds()).slice(-2);
|
||||
const showDateTimeValue = day + "/" + month + "/" + year + " - " + hour + ":" + minute + ":" + second;
|
||||
const objectDateTime = {
|
||||
year: year,
|
||||
month: month,
|
||||
day: day,
|
||||
hour: hour,
|
||||
minute: minute,
|
||||
second: second,
|
||||
showDateTimeValue: showDateTimeValue
|
||||
};
|
||||
timeNow.setMinutes(timeNow.getMinutes() - enteredOffset);
|
||||
return objectDateTime;
|
||||
}
|
||||
|
||||
module.exports = { showDateTime, dateTimeUTC };
|
Reference in New Issue
Block a user