180 lines
4.9 KiB
JavaScript
180 lines
4.9 KiB
JavaScript
import express from "express";
|
|
import mysql from "mysql2/promise";
|
|
import { getTopTen } from "./db.js";
|
|
import { resourceUsage } from "process";
|
|
|
|
export const connection = await mysql.createConnection({
|
|
host: "localhost",
|
|
user: "monty",
|
|
password: "some_pass",
|
|
database: "timelog",
|
|
});
|
|
connection.config.namedPlaceholders = true;
|
|
|
|
const router = express.Router();
|
|
|
|
router.get("/getall", async (req, res) => {
|
|
let sql =
|
|
"SELECT u.f_name,u.l_name,u.mail,p.name,t.time,t.date,t.user \
|
|
FROM Timelog t \
|
|
INNER JOIN Project p ON p.id=t.project \
|
|
INNER JOIN User u ON u.id=t.user ";
|
|
let where = "WHERE t.date BETWEEN ? AND ? ";
|
|
let order = "ORDER BY ?? ";
|
|
let offsetSql = "LIMIT 10 OFFSET ?;";
|
|
let flag = 0;
|
|
if (req.query.from || req.query.to) {
|
|
sql = sql + where;
|
|
flag += 1;
|
|
}
|
|
if (req.query.sortby) {
|
|
sql = sql + order;
|
|
flag += 2;
|
|
}
|
|
sql = sql + offsetSql;
|
|
let results;
|
|
let fields;
|
|
if (flag == 0) {
|
|
[results, fields] = await connection.query(sql, [
|
|
parseInt(req.query.offset),
|
|
]);
|
|
} else if (flag === 1) {
|
|
[results, fields] = await connection.query(sql, [
|
|
req.query.from,
|
|
req.query.to,
|
|
parseInt(req.query.offset),
|
|
]);
|
|
} else if (flag === 2) {
|
|
[results, fields] = await connection.query(sql, [
|
|
req.query.sortby,
|
|
parseInt(req.query.offset),
|
|
]);
|
|
} else if (flag === 3) {
|
|
[results, fields] = await connection.query(sql, [
|
|
req.query.from,
|
|
req.query.to,
|
|
req.query.sortby,
|
|
parseInt(req.query.offset),
|
|
]);
|
|
}
|
|
res.json(results);
|
|
});
|
|
router.get("/gettopten", async (req, res) => {
|
|
let filteredResults;
|
|
let results2;
|
|
let from = "2021-01-01";
|
|
let to = "2029-01-01";
|
|
let filterBy = "user";
|
|
if (req.query.from) from = req.query.from;
|
|
if (req.query.to) to = req.query.to;
|
|
|
|
try {
|
|
const [results, fields] = await connection.query(
|
|
"SELECT t.user,t.time,t.date,t.project \
|
|
FROM Timelog t\
|
|
WHERE t.date BETWEEN ? AND ? ;",
|
|
[from, to],
|
|
);
|
|
filteredResults = results;
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
|
|
if (req.query.filterBy) filterBy = req.query.filterBy;
|
|
// how much time each user has logged during that time period
|
|
if (filterBy === "user") {
|
|
let users = {};
|
|
for (let i = 0; i < filteredResults.length; i++) {
|
|
if (filteredResults[i].user in users) {
|
|
users[filteredResults[i].user] += filteredResults[i].time;
|
|
} else {
|
|
users[filteredResults[i].user] = filteredResults[i].time;
|
|
}
|
|
}
|
|
// Create items array
|
|
let items = Object.keys(users).map(function (key) {
|
|
return [key, users[key]];
|
|
});
|
|
|
|
// Sort the array based on the second element
|
|
items.sort(function (first, second) {
|
|
return second[1] - first[1];
|
|
});
|
|
|
|
// Create a new array with only the first 10 items
|
|
results2 = items.slice(0, 10);
|
|
} else if (filterBy === "project") {
|
|
let projects = {};
|
|
for (let i = 0; i < filteredResults.length; i++) {
|
|
if (filteredResults[i].project in projects) {
|
|
projects[filteredResults[i].project] += filteredResults[i].time;
|
|
} else {
|
|
projects[filteredResults[i].project] = filteredResults[i].time;
|
|
}
|
|
}
|
|
// Create items array
|
|
let items = Object.keys(projects).map(function (key) {
|
|
return [key, projects[key]];
|
|
});
|
|
|
|
// Sort the array based on the second element
|
|
items.sort(function (first, second) {
|
|
return second[1] - first[1];
|
|
});
|
|
|
|
// Create a new array with only the first 10 items
|
|
results2 = items.slice(0, 10);
|
|
}
|
|
|
|
res.json(results2);
|
|
});
|
|
router.get("/reset", async (req, res) => {
|
|
try {
|
|
const [results, fields] = await connection.query("CALL InitDb;", []);
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
res.status(200).json({ message: "Success" });
|
|
});
|
|
router.get("/getUser", async (req, res) => {
|
|
const userId = req.query.userid;
|
|
let results, fields;
|
|
console.log(userId);
|
|
try {
|
|
[results, fields] = await connection.query(
|
|
"SELECT p.name,t.time,t.project \
|
|
FROM Timelog t \
|
|
INNER JOIN Project p ON p.id=t.project \
|
|
INNER JOIN User u ON u.id=t.user \
|
|
WHERE USER = ? ;",
|
|
[userId],
|
|
);
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
let projects = {};
|
|
let projectIdtoName = {};
|
|
for (let i = 0; i < results.length; i++) {
|
|
if (results[i].project in projects) {
|
|
projects[results[i].project] += results[i].time;
|
|
} else {
|
|
projects[results[i].project] = results[i].time;
|
|
projectIdtoName[results[i].project] = results[i].name;
|
|
}
|
|
}
|
|
// map projectIds to project names before sending the data
|
|
let respData = {};
|
|
for (let key in projects) {
|
|
if (projects.hasOwnProperty(key)) {
|
|
respData[projectIdtoName[key]] = projects[key];
|
|
}
|
|
}
|
|
res.json(respData);
|
|
});
|
|
|
|
const app = express();
|
|
app.use(express.json());
|
|
app.use("/api", router);
|
|
const PORT = process.env.PORT || 5000;
|
|
app.listen(PORT, () => console.log(`Server started on port ${PORT}`));
|