Files
2022-10-03 19:59:51 +02:00

321 lines
9.6 KiB
JavaScript

// 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;