Current monitors
-
5
+
{monitors.length}
@@ -24,4 +31,8 @@ const CurrentMonitors = ({ monitors }) => {
);
};
+CurrentMonitors.propTypes = {
+ monitors: PropTypes.arrayOf(PropTypes.object).isRequired,
+};
+
export default CurrentMonitors;
diff --git a/Client/src/Components/HostsTable/index.jsx b/Client/src/Components/HostsTable/index.jsx
index 2867ef26a..8e5af7164 100644
--- a/Client/src/Components/HostsTable/index.jsx
+++ b/Client/src/Components/HostsTable/index.jsx
@@ -1,4 +1,32 @@
-import React from "react";
+import BarChart from "../Charts/BarChart/BarChart";
+import PropTypes from "prop-types";
+import Host from "../Host/";
+import HostStatus from "../HostStatus";
+/**
+ * HostsTable displays the current status of monitor
+ *
+ * @component
+ * @param {Array} monitors - An array of monitor objects to be displayed.
+ */
+
+const getLastCheckStatus = (monitor) => {
+ if (monitor.checks.length === 0) {
+ // Default values for when there are no checks
+ return {
+ color: "var(--env-var-color-21)",
+ statusText: "No Data",
+ dotColor: "var(--env-var-color-19)",
+ };
+ }
+
+ const lastCheck = monitor.checks[monitor.checks.length - 1];
+ const isUp = lastCheck.status === true;
+ return {
+ color: isUp ? "var(--env-var-color-20)" : "var(--env-var-color-21)",
+ statusText: isUp ? "Up" : "Down",
+ dotColor: isUp ? "var(--env-var-color-17)" : "var(--env-var-color-19)",
+ };
+};
const HostsTable = ({ monitors }) => {
return (
@@ -8,23 +36,45 @@ const HostsTable = ({ monitors }) => {
| Host |
Status |
- Team |
+ Response |
Actions |
- {monitors.map((monitor, index) => (
-
- | {monitor.host} |
- {monitor.status} |
- {monitor.team} |
- {monitor.actions} |
-
- ))}
+ {monitors.map((monitor) => {
+ const host = Host(
+ monitor.name,
+ 100,
+ "var(--env-var-color-17)",
+ monitor.url
+ );
+
+ const { color, currentStatus, dotColor } =
+ getLastCheckStatus(monitor);
+
+ const status = HostStatus(color, currentStatus, dotColor);
+
+ return (
+
+ | {host} |
+ {status} |
+
+
+ |
+
+ {monitor.actions}
+ |
+
+ );
+ })}
);
};
+HostsTable.propTypes = {
+ monitors: PropTypes.arrayOf(PropTypes.object).isRequired,
+};
+
export default HostsTable;
diff --git a/Client/src/Features/Monitors/monitorsSlice.js b/Client/src/Features/Monitors/monitorsSlice.js
index c025b02c2..8cb5e323f 100644
--- a/Client/src/Features/Monitors/monitorsSlice.js
+++ b/Client/src/Features/Monitors/monitorsSlice.js
@@ -1,5 +1,6 @@
import axios from "axios";
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit";
+import { jwtDecode } from "jwt-decode";
const initialState = {
isLoading: false,
@@ -25,9 +26,17 @@ export const getMonitors = createAsyncThunk(
export const getMonitorsByUserId = createAsyncThunk(
"montiors/getMonitorsByUserId",
async (token, thunkApi) => {
+ const user = jwtDecode(token);
try {
- // TODO get userId and make request
- console.log(token);
+ const res = await axios.get(
+ import.meta.env.VITE_APP_API_BASE_URL + "/monitors/user/" + user._id,
+ {
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ }
+ );
+ return res.data;
} catch (error) {
return thunkApi.rejectWithValue(error.response.data);
}
@@ -50,7 +59,6 @@ const monitorsSlice = createSlice({
state.isLoading = false;
state.success = action.payload.success;
state.msg = action.payload.msg;
- console.log(action.payload);
state.monitors = action.payload.data;
})
.addCase(getMonitors.rejected, (state, action) => {
@@ -68,7 +76,6 @@ const monitorsSlice = createSlice({
.addCase(getMonitorsByUserId.fulfilled, (state, action) => {
state.isLoading = false;
state.success = action.payload.msg;
- console.log(action.payload);
state.monitors = action.payload.data;
})
.addCase(getMonitorsByUserId.rejected, (state, action) => {
diff --git a/Client/src/Layouts/HomeLayout/index.jsx b/Client/src/Layouts/HomeLayout/index.jsx
index a7f7ce9df..2e4bc5e6b 100644
--- a/Client/src/Layouts/HomeLayout/index.jsx
+++ b/Client/src/Layouts/HomeLayout/index.jsx
@@ -3,24 +3,12 @@ import { Outlet } from "react-router";
import DashboardSidebar from "../../Components/DashboardSidebar";
import "./index.css";
-// Demo, remove me
-import { useSelector } from "react-redux";
-// Emd Demo
-
const HomeLayout = () => {
- const authState = useSelector((state) => state.auth);
- const { user, msg } = authState;
return (
- {/* Remove me later */}
- {user &&
{user.firstname}
}
- {user &&
{user.lastname}
}
- {user &&
{user.email}
}
- {msg &&
Msg: {msg}
}
- {/* I am a demo */}
diff --git a/Client/src/Pages/Monitors/CurrentStats.jsx b/Client/src/Pages/Monitors/CurrentStats.jsx
index de15d953c..729de36d3 100644
--- a/Client/src/Pages/Monitors/CurrentStats.jsx
+++ b/Client/src/Pages/Monitors/CurrentStats.jsx
@@ -1,46 +1,29 @@
-import React, { useEffect, useState } from "react";
-import Host from "../../Components/Host";
-import HostStatus from "../../Components/HostStatus";
-import HostActions from "../../Components/HostActions";
-import BarChart from "../../Components/Charts/BarChart/BarChart";
import Button from "../../Components/Button";
import ServerStatus from "../../Components/Charts/Servers/ServerStatus";
import CurrentMonitors from "../../Components/CurrentMonitors";
-import MockData from "../../Mock/sample_data.json";
+import PropTypes from "prop-types";
-const CurrentStats = (mockdata = true) => {
- // The hardcoded part is passed as default value for the purpose of demonstration.
- // Pass an empty array, [], before fetching the data
- const [monitors, setMonitors] = useState([]);
+/**
+ * CurrentStats displays the current status of monitor
+ *
+ * @component
+ * @param {Array
} monitors - An array of monitor objects to be displayed.
+ */
- useEffect(() => {
- if (mockdata) {
- console.log(MockData.data);
- setMonitors(
- MockData.data.map((item) => ({
- host: Host(item.name, 100, "var(--env-var-color-17)", item.url),
- status: HostStatus(
- item.isActive
- ? "var(--env-var-color-20)"
- : "var(--env-var-color-21)",
- item.isActive ? "Up" : "Down",
- item.isActive
- ? "var(--env-var-color-17)"
- : "var(--env-var-color-19)"
- ),
- team: ,
- actions: HostActions(),
- }))
- );
+const CurrentStats = ({ monitors }) => {
+ const up = monitors.reduce((acc, cur) => {
+ if (cur.checks.length > 0) {
+ return cur.checks[cur.checks.length - 1].status === true ? acc + 1 : acc;
}
- }, [mockdata]);
+ return 0;
+ }, 0);
- // useEffect(() => {
- // fetch("API_URL")
- // .then((response) => response.json())
- // .then((data) => setMonitors(data))
- // .catch((error) => console.error(error));
- // }, []);
+ const down = monitors.reduce((acc, cur) => {
+ if (cur.checks.length > 0) {
+ return cur.checks[cur.checks.length - 1].status === false ? acc + 1 : acc;
+ }
+ return 0;
+ }, 0);
return (
@@ -56,9 +39,9 @@ const CurrentStats = (mockdata = true) => {
-
-
-
+
+
+
@@ -66,4 +49,8 @@ const CurrentStats = (mockdata = true) => {
);
};
+CurrentStats.propTypes = {
+ monitors: PropTypes.arrayOf(PropTypes.object).isRequired,
+};
+
export default CurrentStats;
diff --git a/Client/src/Pages/Monitors/index.jsx b/Client/src/Pages/Monitors/index.jsx
index a1dd61f0c..875f59443 100644
--- a/Client/src/Pages/Monitors/index.jsx
+++ b/Client/src/Pages/Monitors/index.jsx
@@ -1,13 +1,23 @@
// import CreateNewMonitor from "./CreateNewMonitor";
import CurrentStats from "./CurrentStats";
import "./index.css";
-import React from "react";
+import { useEffect } from "react";
+import { useSelector } from "react-redux";
+import { useDispatch } from "react-redux";
+import { getMonitorsByUserId } from "../../Features/Monitors/monitorsSlice";
const Monitors = () => {
+ const monitorState = useSelector((state) => state.monitors);
+ const authstate = useSelector((state) => state.auth);
+ const dispatch = useDispatch();
+
+ useEffect(() => {
+ dispatch(getMonitorsByUserId(authstate.authToken));
+ }, []);
+
return (
-
- {/* */}
+
);
};
diff --git a/Server/service/networkService.js b/Server/service/networkService.js
index f3f40999d..2437786fb 100644
--- a/Server/service/networkService.js
+++ b/Server/service/networkService.js
@@ -2,6 +2,7 @@ const axios = require("axios");
const ping = require("ping");
const logger = require("../utils/logger");
const Check = require("../models/Check");
+const { Console } = require("winston/lib/winston/transports");
class NetworkService {
constructor(db) {
@@ -149,9 +150,9 @@ class NetworkService {
const insertedCheck = await check.save();
return insertedCheck.status;
} catch (error) {
- logger.error(`Error wrtiting check for ${job.id}`, {
+ logger.error(`Error wrtiting check for ${check.monitorId}`, {
service: this.SERVICE_NAME,
- jobId: job.id,
+ monitorId: check.monitorId,
error: error,
});
return false;