1
0
mirror of https://github.com/elisspace/FxLifeSheet.git synced 2026-08-29 15:44:00 +00:00
Files
FxLifeSheet/web.ts
2022-04-28 12:30:03 +02:00

287 lines
7.4 KiB
TypeScript

// Third party dependencies
var http = require("http");
const moment = require("moment");
let postgres = require("./classes/postgres.js");
// State
var lastFetchedData = {};
function loadCurrentData(key) {
console.log(`Refreshing latest ${key} entry...`);
let query;
if (key == "gym" || key == "meditated") {
query =
"SELECT * FROM raw_data WHERE key = $1 AND value != '0' ORDER BY timestamp DESC LIMIT 1";
} else {
query =
"SELECT * FROM raw_data WHERE key = $1 ORDER BY timestamp DESC LIMIT 1";
}
console.log(query);
postgres.client.query(
{
text: query,
values: [key]
},
(err, res) => {
console.log(res);
if (err) {
console.error(err);
return;
}
let lastRow = res.rows[0];
if (lastRow != null) {
lastFetchedData[key] = {
time: moment(Number(lastRow.timestamp)).format(),
value: Number(lastRow.value)
};
}
}
);
}
console.log("Launching up API web server...");
// Periodically refresh the value
let interval = 5 * 60 * 1000;
let keys = [
"mood",
"sleepDurationWithings",
"emailsInbox",
"weight",
"gym",
"macrosCarbs",
"macrosProtein",
"macrosFat",
"weeklyComputerTime",
"meditated"
];
for (let i = 0; i < keys.length; i++) {
let key = keys[i];
setInterval(function() {
loadCurrentData(key);
}, interval);
loadCurrentData(key);
lastFetchedData[key] = {
time: null,
value: null
};
}
// One-off total computer usage
postgres.client.query(
{
text:
"SELECT SUM(value::int) FROM raw_data WHERE key = 'rescue_time_daily_computer_used'"
},
(err, res) => {
console.log(res);
if (err) {
console.error(err);
return;
}
let hoursComputerUsed = res.rows[0]["sum"] / 60.0;
// calculate up averages since we don't import RescueTime every day
let daysDifference = moment().diff(moment("2020-03-22"), "days"); // that's when we imported last
hoursComputerUsed += daysDifference * 6.5; // average computer usage a day nowadays
lastFetchedData["totalComputerUsageHours"] = {
time: moment().format(),
value: Math.round(hoursComputerUsed)
};
}
);
// One-off query to get the total amount of entries
postgres.client.query(
{
text: "SELECT COUNT(*) FROM raw_data"
},
(err, res) => {
console.log(res);
if (err) {
console.error(err);
return;
}
lastFetchedData["totalAmountOfEntries"] = {
time: moment().format(),
value: Number(res.rows[0]["count"])
};
}
);
// Periodically refresh the total amount of entries
interval = 15 * 60 * 1000;
const keysStartingWith = ["rescue_time", "swarm", "weather", "dailySteps"];
function loadKeysCountData(key) {
const keyPlusHash = key + "%";
const query = "SELECT COUNT(*) AS value FROM raw_data WHERE key LIKE $1";
console.log(query);
postgres.client.query(
{
text: query,
values: [keyPlusHash]
},
(err, res) => {
console.log(res);
if (err) {
console.error(err);
return;
}
let lastRow = res.rows[0];
if (lastRow != null) {
lastFetchedData[key] = {
time: moment().format(),
value: Number(lastRow.value)
};
}
}
);
}
for (let i = 0; i < keysStartingWith.length; i++) {
let key = keysStartingWith[i];
setInterval(function() {
loadKeysCountData(key);
}, interval);
lastFetchedData[key] = {
time: null,
value: null
};
loadKeysCountData(key);
}
// One Off to fetch manually entered, and time ranges
postgres.client.query(
{
text:
"SELECT COUNT(*) AS value FROM raw_data WHERE source = 'tag_days' OR source = 'add_time_range'"
},
(err, res) => {
lastFetchedData["timeRanges"] = {
time: moment().format(),
value: Number(res.rows[0].value)
};
}
);
setInterval(function() {
postgres.client.query(
{
text: "SELECT COUNT(*) AS value FROM raw_data"
},
(err, res) => {
const manually =
Number(res.rows[0].value) -
lastFetchedData["timeRanges"].value -
lastFetchedData["rescue_time"].value -
lastFetchedData["swarm"].value -
lastFetchedData["weather"].value -
lastFetchedData["dailySteps"].value;
lastFetchedData["manuallyEntered"] = {
time: moment().format(),
value: manually
};
}
);
}, 10000);
function updateOverviewTable() {
const keysForDashboard = [
"mood",
"sleepDurationWithings",
"gym",
"macroAdherence",
"minutesRead",
"weight",
"veggies",
"meditated",
"healthy",
"headache",
"hoursDriving",
"alcoholIntake",
"withingsSleepingHR",
"watchedTVHours"
];
let queryToUse = "SELECT";
const weekTimestamp =
moment()
.subtract(7, "days")
.unix() * 1000;
const monthTimestamp =
moment()
.subtract(30, "days")
.unix() * 1000;
const quarterTimestamp =
moment()
.subtract(90, "days")
.unix() * 1000;
const yearTimestamp =
moment()
.subtract(365, "days")
.unix() * 1000;
for (let i = 0; i < keysForDashboard.length; i++) {
let athTimestamp = moment("2019-04-12").unix() * 1000;
let key = keysForDashboard[i];
if (key == "mood") {
athTimestamp = moment("2018-02-01").unix() * 1000;
}
queryToUse += `(SELECT ROUND(AVG(value::numeric), 4) FROM raw_data WHERE timestamp > ${weekTimestamp} AND key='${key}') as ${key}Week,`;
queryToUse += `(SELECT ROUND(AVG(value::numeric), 4) FROM raw_data WHERE timestamp > ${monthTimestamp} AND key='${key}') as ${key}Month,`;
queryToUse += `(SELECT ROUND(AVG(value::numeric), 4) FROM raw_data WHERE timestamp > ${quarterTimestamp} AND key='${key}') as ${key}Quarter,`;
queryToUse += `(SELECT ROUND(AVG(value::numeric), 4) FROM raw_data WHERE timestamp > ${yearTimestamp} AND key='${key}') as ${key}Year,`;
queryToUse += `(SELECT ROUND(AVG(value::numeric), 4) FROM raw_data WHERE timestamp > ${athTimestamp} AND key='${key}') as ${key}AllTime,`;
queryToUse += `(SELECT COUNT(value::numeric) FROM raw_data WHERE timestamp > ${weekTimestamp} AND key='${key}') as ${key}WeekCount,`;
queryToUse += `(SELECT COUNT(value::numeric) FROM raw_data WHERE timestamp > ${monthTimestamp} AND key='${key}') as ${key}MonthCount,`;
queryToUse += `(SELECT COUNT(value::numeric) FROM raw_data WHERE timestamp > ${quarterTimestamp} AND key='${key}') as ${key}QuarterCount,`;
queryToUse += `(SELECT COUNT(value::numeric) FROM raw_data WHERE timestamp > ${yearTimestamp} AND key='${key}') as ${key}YearCount,`;
queryToUse += `(SELECT COUNT(value::numeric) FROM raw_data WHERE timestamp > ${athTimestamp} AND key='${key}') as ${key}AllTimeCount`;
if (i != keysForDashboard.length - 1) {
queryToUse += ",";
}
}
console.log(queryToUse);
postgres.client.query(
{
text: queryToUse
},
(err, res) => {
lastFetchedData["overviewTable"] = {
time: moment().format(),
value: res.rows[0]
};
}
);
}
setInterval(updateOverviewTable, 5 * 60 * 1000);
updateOverviewTable();
http
.createServer(function(req, res) {
// Verify the GET parameter "password" includes our keyphrase
res.writeHead(200, {
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers":
"Origin, X-Requested-With, Content-Type, Accept"
});
res.write(JSON.stringify(lastFetchedData));
return res.end();
})
.listen(process.env.PORT);
export {};