From 89d36a6ae22aa40fc83e8929ec214f87b1fa12e8 Mon Sep 17 00:00:00 2001
From: Federico Hurtado <fed_home@Federicos-Mac-mini.local>
Date: Wed, 30 Oct 2024 11:00:12 -0400
Subject: [PATCH] Able to get login events within a specified timerange. Set up
 endpoint fully.

---
 backend/index.js                           |  2 ++
 backend/repository/activityRepository.js   | 19 ++++++++++++++-
 backend/routes/activityMonitoringRoutes.js | 28 ++++++++++++++++++++++
 backend/service/activityLoggerService.js   | 15 +++++++++---
 4 files changed, 60 insertions(+), 4 deletions(-)
 create mode 100644 backend/routes/activityMonitoringRoutes.js

diff --git a/backend/index.js b/backend/index.js
index 056453e..e571663 100644
--- a/backend/index.js
+++ b/backend/index.js
@@ -3,6 +3,7 @@ const session = require("express-session");
 const cors = require("cors");
 require("dotenv").config();
 const userRoutes = require("./routes/userRoutes");
+const activityRouter = require("./routes/activityMonitoringRoutes");
 
 // create connection to db and initialize table schema
 const { pool } = require("./config/database/database.config");
@@ -49,6 +50,7 @@ app.use(function (req, res, next) {
 require("./config/auth/auth.routes")(app);
 app.use("/api/user", userRoutes);
 app.use("/api/person", peopleRouter);
+app.use("/api/activity", activityRouter);
 
 // Basic route to check if server is running
 app.get("/api", (req, res) => {
diff --git a/backend/repository/activityRepository.js b/backend/repository/activityRepository.js
index 3f3b4fd..7a69c34 100644
--- a/backend/repository/activityRepository.js
+++ b/backend/repository/activityRepository.js
@@ -27,7 +27,23 @@ async function logSuccessfulLogin(userId, timestamp) {
   }
 }
 
-async function getLoginDataTimerange() {}
+async function getLoginDataTimerange(start, end) {
+  try {
+    // get all login data within the start and end timerange
+    const query = `
+      SELECT *
+      FROM userLogin
+      WHERE eventTimestamp BETWEEN ? AND ?
+      ORDER BY eventTimestamp DESC
+    `;
+    const [rows] = await pool.query(query, [start, end]);
+    return rows;
+  } catch (error) {
+    // throw error to be caught in service
+    console.error("Error fetching login data:", error);
+    throw error;
+  }
+}
 
 async function getLoginDataByUser() {}
 
@@ -39,4 +55,5 @@ async function getDatabaseChangeByUser() {}
 
 module.exports = {
   logSuccessfulLogin,
+  getLoginDataTimerange,
 };
diff --git a/backend/routes/activityMonitoringRoutes.js b/backend/routes/activityMonitoringRoutes.js
new file mode 100644
index 0000000..17d4c1f
--- /dev/null
+++ b/backend/routes/activityMonitoringRoutes.js
@@ -0,0 +1,28 @@
+const express = require("express");
+const { viewLoginsTimerange } = require("../service/activityLoggerService");
+
+const activityRouter = express.Router();
+
+// get login history by timerange
+activityRouter.get("/login-data", async (req, res) => {
+  const { start, end } = req.query;
+
+  // ensure both params are given
+  if (!start || !end) {
+    return res
+      .status(400)
+      .json({ message: "Please provide both start and end dates." });
+  }
+
+  try {
+    const data = await viewLoginsTimerange(start, end);
+    res.status(200).json(data);
+  } catch {
+    console.log("error fetching login data: ", error);
+    res.status(500).json({ message: "Internal service error." });
+  }
+});
+
+// get db history for timerange
+
+module.exports = activityRouter;
diff --git a/backend/service/activityLoggerService.js b/backend/service/activityLoggerService.js
index ebc0e82..80c0da9 100644
--- a/backend/service/activityLoggerService.js
+++ b/backend/service/activityLoggerService.js
@@ -1,4 +1,7 @@
-const { logSuccessfulLogin } = require("../repository/activityRepository");
+const {
+  logSuccessfulLogin,
+  getLoginDataTimerange,
+} = require("../repository/activityRepository");
 
 /*
 Function that creates a row of data in the userLogin table 
@@ -15,8 +18,14 @@ async function documentSuccessfulLogin(userId, timestamp) {
 
 async function logDatabaseChange() {}
 
-async function viewLogins() {}
+/*
+Get the login data for a sopecific time range
+*/
+async function viewLoginsTimerange(start, end) {
+  // will throw error if there is a problem
+  return await getLoginDataTimerange(start, end);
+}
 
 async function viewDatabaseChanges() {}
 
-module.exports = { documentSuccessfulLogin };
+module.exports = { documentSuccessfulLogin, viewLoginsTimerange };
-- 
GitLab