quiz init commit
This commit is contained in:
@@ -0,0 +1,320 @@
|
||||
// const SessionService = require('../../services/SessionService');
|
||||
const app = require("express").Router();
|
||||
const db = require("../../models");
|
||||
const axios = require("axios");
|
||||
|
||||
//api: get output variable info
|
||||
app.get("/api/v1/output-variable/:name", async function (req, res, next) {
|
||||
try {
|
||||
//body should have actives lsit as array
|
||||
const { name } = req.params;
|
||||
|
||||
const outputVariable = await db.output_variable.getByFields({ name });
|
||||
if (!outputVariable) {
|
||||
return res.status(404).json({ success: false, message: `Output variable of that name ${name} is not found.` });
|
||||
}
|
||||
let payload = {},
|
||||
actives = [];
|
||||
if (outputVariable.active_list) {
|
||||
let activeList = JSON.parse(outputVariable.active_list);
|
||||
for (const activeId of activeList) {
|
||||
const active = await db.active.getByPK(activeId);
|
||||
if (active) {
|
||||
actives.push(active.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
payload = { name: outputVariable.name, actives: actives, ranges_response: JSON.parse(outputVariable.ranges_response) };
|
||||
|
||||
return res.status(201).json({ success: true, data: payload });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/v1/output-variables/actives-list", async function (req, res, next) {
|
||||
try {
|
||||
//body should have actives lsit as array
|
||||
const { names_list } = req.query;
|
||||
if (!names_list) {
|
||||
return res.status(401).json({ success: false, message: "Empty list" });
|
||||
}
|
||||
const outputVariablesList = names_list.split(",");
|
||||
|
||||
const outputVars = await db.output_variable.findAll({
|
||||
where: {
|
||||
name: outputVariablesList,
|
||||
},
|
||||
});
|
||||
|
||||
let allActivesList = [];
|
||||
outputVars.forEach((outputVar) => {
|
||||
if (outputVar.active_list) {
|
||||
let parsedList = JSON.parse(outputVar.active_list);
|
||||
if (parsedList.length) {
|
||||
parsedList.forEach((item) => {
|
||||
if (!allActivesList.includes(item)) {
|
||||
allActivesList.push(item);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
let actives = await db.active
|
||||
.findAll({
|
||||
where: {
|
||||
id: allActivesList,
|
||||
},
|
||||
})
|
||||
.then((data) => {
|
||||
return data.map((item) => {
|
||||
return item.name;
|
||||
});
|
||||
});
|
||||
if (!actives) {
|
||||
return res.status(404).json({ success: false, message: "No actives found for this list" });
|
||||
}
|
||||
return res.status(201).json({ success: true, data: actives });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/v1/places/autocomplete", async function (req, res, next) {
|
||||
try {
|
||||
const { input } = req.query;
|
||||
|
||||
var config = {
|
||||
method: "get",
|
||||
// url: `https://maps.googleapis.com/maps/api/place/autocomplete/json?input=${encodeURIComponent(input)}&types=(regions)&key=${process.env.GOOGLE_PLACES_API_KEY}`,
|
||||
url: `https://maps.googleapis.com/maps/api/place/autocomplete/json?input=${encodeURIComponent(input)}&key=${process.env.GOOGLE_PLACES_API_KEY}`,
|
||||
headers: {},
|
||||
};
|
||||
|
||||
const response = await axios(config).then(function (response) {
|
||||
return response.data;
|
||||
});
|
||||
const payload = response.predictions.map((prediction) => {
|
||||
return {
|
||||
name: prediction.description,
|
||||
id: prediction.place_id,
|
||||
};
|
||||
});
|
||||
|
||||
return res.status(201).json(payload);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
app.get("/api/v1/rules", async function (req, res, next) {
|
||||
try {
|
||||
//body should have actives lsit as array
|
||||
const rules = await db.rule.getAll();
|
||||
|
||||
if (!rules) {
|
||||
return res.status(404).json({ success: false, message: `There are no rules` });
|
||||
}
|
||||
|
||||
return res.status(201).json({ success: true, data: rules });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/v1/profile-sections", async function (req, res, next) {
|
||||
try {
|
||||
//body should have actives lsit as array
|
||||
const profileSections = await db.result_profile.getAll();
|
||||
|
||||
if (!profileSections) {
|
||||
return res.status(404).json({ success: false, message: `There are sections to display` });
|
||||
}
|
||||
|
||||
for (const section of profileSections) {
|
||||
if (section.output_variable_list) {
|
||||
const parsedList = JSON.parse(section.output_variable_list);
|
||||
let actualList = await db.output_variable.findAll({
|
||||
where: {
|
||||
id: parsedList,
|
||||
},
|
||||
});
|
||||
actualList = actualList.map((ov) => ov.name);
|
||||
section.output_variable_list = actualList;
|
||||
}
|
||||
}
|
||||
return res.status(201).json({ success: true, data: profileSections });
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
app.get("/api/v1/weather-profile", async function (req, res, next) {
|
||||
try {
|
||||
const { city_id } = req.query;
|
||||
var config = {
|
||||
method: "get",
|
||||
url: `https://maps.googleapis.com/maps/api/place/details/json?place_id=${city_id}&fields=geometry,formatted_address,address_component&key=${process.env.GOOGLE_PLACES_API_KEY}`,
|
||||
headers: {},
|
||||
};
|
||||
|
||||
const place_details = await axios(config);
|
||||
// .then((response) => response.data);
|
||||
if (place_details?.data?.status !== "OK") {
|
||||
console.error(place_details);
|
||||
return res.status(400).json({ success: false, message: "Can't get location" });
|
||||
}
|
||||
const lon = place_details.data.result.geometry.location.lng;
|
||||
const lat = place_details.data.result.geometry.location.lat;
|
||||
const country = place_details.data.result.address_components.find((adr) => adr.types.includes("country"));
|
||||
// const country;
|
||||
config = {
|
||||
method: "get",
|
||||
url: `https://api.openweathermap.org/data/2.5/weather?lat=${lat}&lon=${lon}&appid=${process.env.OPEN_WEATHER_API_KEY}&units=metric`,
|
||||
};
|
||||
|
||||
const weather = await axios(config).then((response) => response.data);
|
||||
|
||||
config = {
|
||||
method: "get",
|
||||
url: `https://api.openweathermap.org/data/2.5/air_pollution?lat=${lat}&lon=${lon}&appid=${process.env.OPEN_WEATHER_API_KEY}&units=metric`,
|
||||
};
|
||||
const pollutionData = await axios(config).then((response) => response.data);
|
||||
|
||||
// let temperatureWeight = weather.main.temp;
|
||||
let { sunValue, sunWeight, temperatureWeight } = calculateSun(weather.main.temp);
|
||||
let { humidityValue, humidityWeight } = calculateHumidity(weather.main.humidity);
|
||||
let { pollutionValue, pollutionWeight } = calculatePollution(pollutionData.list[0].main.aqi);
|
||||
let temperature = weather.main.temp;
|
||||
let unit = "°C";
|
||||
if (country.short_name == "GB" || country.short_name == "US") {
|
||||
temperature = (temperature * 9) / 5 + 32;
|
||||
unit = "°F";
|
||||
}
|
||||
let payload = {
|
||||
unit: unit,
|
||||
humidity: humidityValue,
|
||||
temperature: Math.round(temperature),
|
||||
sun: sunValue,
|
||||
pollution: pollutionValue,
|
||||
weights: {
|
||||
Pollution: {
|
||||
value: pollutionWeight,
|
||||
base: 33,
|
||||
},
|
||||
Sun: {
|
||||
value: sunWeight,
|
||||
base: 10,
|
||||
},
|
||||
Temperature: {
|
||||
value: temperatureWeight,
|
||||
base: 0,
|
||||
},
|
||||
Hydration: {
|
||||
value: humidityWeight,
|
||||
base: 15,
|
||||
},
|
||||
},
|
||||
};
|
||||
return res.status(201).json({
|
||||
success: true,
|
||||
data: payload,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return res.status(500).json({ success: false, message: error.message || "Something went wrong" });
|
||||
}
|
||||
});
|
||||
|
||||
function calculateSun(sunTemp) {
|
||||
let maxSun = 56.7;
|
||||
let sun = parseFloat(sunTemp / maxSun) * 100;
|
||||
if (sun > 0 && sun <= 33.334) {
|
||||
return {
|
||||
sunValue: "low",
|
||||
sunWeight: 33.334 * 10,
|
||||
temperatureWeight: 0,
|
||||
};
|
||||
} else if (sun > 33.334 && sun <= 66.667) {
|
||||
return {
|
||||
sunValue: "medium",
|
||||
sunWeight: 66.667 * 10,
|
||||
temperatureWeight: 0,
|
||||
};
|
||||
} else if (sun > 66.667 && sun <= 100) {
|
||||
return {
|
||||
sunValue: "High",
|
||||
sunWeight: 100 * 10,
|
||||
temperatureWeight: 0,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
sunValue: "",
|
||||
sunWeight: 0,
|
||||
temperatureWeight: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
function calculateHumidity(humidity) {
|
||||
if (humidity < 30) {
|
||||
return {
|
||||
humidityValue: "Low",
|
||||
humidityWeight: 33.334 * 15,
|
||||
};
|
||||
} else if (humidity >= 30 && humidity < 50) {
|
||||
return {
|
||||
humidityValue: "Medium",
|
||||
humidityWeight: 66.667 * 15,
|
||||
};
|
||||
} else if (humidity >= 50) {
|
||||
return {
|
||||
humidityValue: "High",
|
||||
humidityWeight: 100 * 15,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
humidityValue: "",
|
||||
humidityWeight: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
function calculatePollution(airQuality) {
|
||||
// Air Quality Index. Possible values: 1, 2, 3, 4, 5. Where 1 = Good, 2 = Fair, 3 = Moderate, 4 = Poor, 5 = Very Poor.
|
||||
if (airQuality == 1) {
|
||||
return {
|
||||
pollutionValue: "Very low",
|
||||
pollutionWeight: 20 * 33,
|
||||
};
|
||||
} else if (airQuality == 2) {
|
||||
return {
|
||||
pollutionValue: "Low",
|
||||
pollutionWeight: 40 * 33,
|
||||
};
|
||||
} else if (airQuality == 3) {
|
||||
return {
|
||||
pollutionValue: "Moderate",
|
||||
pollutionWeight: 60 * 33,
|
||||
};
|
||||
} else if (airQuality == 4) {
|
||||
return {
|
||||
pollutionValue: "High",
|
||||
pollutionWeight: 80 * 33,
|
||||
};
|
||||
} else if (airQuality == 5) {
|
||||
return {
|
||||
pollutionValue: "Very high",
|
||||
pollutionWeight: 100 * 33,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
pollutionValue: "",
|
||||
pollutionWeight: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
module.exports = app;
|
||||
Reference in New Issue
Block a user