diff --git a/Client/src/Pages/Incidents/index.jsx b/Client/src/Pages/Incidents/index.jsx index 4e7a37c6d..10ab30ad5 100644 --- a/Client/src/Pages/Incidents/index.jsx +++ b/Client/src/Pages/Incidents/index.jsx @@ -25,17 +25,20 @@ const Incidents = () => { useEffect(() => { const fetchMonitors = async () => { setLoading(true); - const res = await networkService.getMonitorsByTeamId( - authState.authToken, - authState.user.teamId, - -1, - null, - null, - null, - null, - null, - null - ); + const res = await networkService.getMonitorsByTeamId({ + authToken: authState.authToken, + teamId: authState.user.teamId, + limit: -1, + types: null, + status: null, + checkOrder: null, + normalize: null, + page: null, + rowsPerPage: null, + filter: null, + field: null, + order: null, + }); // Reduce to a lookup object for 0(1) lookup if (res?.data?.data?.monitors?.length > 0) { const monitorLookup = res.data.data.monitors.reduce((acc, monitor) => { diff --git a/Client/src/Pages/Monitors/Home/MonitorTable/index.jsx b/Client/src/Pages/Monitors/Home/MonitorTable/index.jsx index 5c43ad880..7203edda7 100644 --- a/Client/src/Pages/Monitors/Home/MonitorTable/index.jsx +++ b/Client/src/Pages/Monitors/Home/MonitorTable/index.jsx @@ -142,17 +142,20 @@ const MonitorTable = ({ isAdmin }) => { try { const { authToken } = authState; const user = jwtDecode(authToken); - const res = await networkService.getMonitorsByTeamId( + const res = await networkService.getMonitorsByTeamId({ authToken, - user.teamId, - 25, - ["http", "ping"], - null, - "desc", - true, - page, - rowsPerPage - ); + teamId: user.teamId, + limit: 25, + types: ["http", "ping"], + status: null, + checkOrder: "desc", + normalize: true, + page: page, + rowsPerPage: rowsPerPage, + filter: null, + field: null, + order: null, + }); setMonitors(res?.data?.data?.monitors ?? []); setMonitorCount(res?.data?.data?.monitorCount ?? 0); } catch (error) { diff --git a/Client/src/Pages/PageSpeed/index.jsx b/Client/src/Pages/PageSpeed/index.jsx index a76e4cca1..3e78b1d6b 100644 --- a/Client/src/Pages/PageSpeed/index.jsx +++ b/Client/src/Pages/PageSpeed/index.jsx @@ -29,17 +29,20 @@ const PageSpeed = ({ isAdmin }) => { const fetchMonitors = async () => { try { setIsLoading(true); - const res = await networkService.getMonitorsByTeamId( - authToken, - user.teamId, - 10, - ["pagespeed"], - null, - "desc", - true, - null, - null - ); + const res = await networkService.getMonitorsByTeamId({ + authToken: authToken, + teamId: user.teamId, + limit: 10, + types: ["pagespeed"], + status: null, + checkOrder: "desc", + normalize: true, + page: null, + rowsPerPage: null, + filter: null, + field: null, + order: null, + }); if (res?.data?.data?.monitors) { setMonitors(res.data.data.monitors); } diff --git a/Client/src/Utils/NetworkService.js b/Client/src/Utils/NetworkService.js index 683ce1aba..63323d5a8 100644 --- a/Client/src/Utils/NetworkService.js +++ b/Client/src/Utils/NetworkService.js @@ -83,26 +83,37 @@ class NetworkService { * ************************************ * * @async - * @param {string} authToken - The authorization token to be used in the request header. - * @param {string} userId - The ID of the user whose monitors are to be retrieved. - * @param {number} [limit] - The maximum number of monitors to retrieve. - * @param {Array} [types] - The types of monitors to retrieve. - * @param {string} [status] - The status of the monitors to retrieve. - * @param {string} [sortOrder] - The order in which to sort the retrieved monitors. - * @param {boolean} [normalize] - Whether to normalize the retrieved monitors. + * @param {Object} config - The configuration object. + * @param {string} config.authToken - The authorization token to be used in the request header. + * @param {string} config.teamId - The ID of the team whose monitors are to be retrieved. + * @param {number} [config.limit] - The maximum number of monitors to retrieve. + * @param {Array} [config.types] - The types of monitors to retrieve. + * @param {string} [config.status] - The status of the monitors to retrieve. + * @param {string} [config.checkOrder] - The order in which to sort the retrieved monitors. + * @param {boolean} [config.normalize] - Whether to normalize the retrieved monitors. + * @param {number} [config.page] - The page number for pagination. + * @param {number} [config.rowsPerPage] - The number of rows per page for pagination. + * @param {string} [config.filter] - The filter to apply to the monitors. + * @param {string} [config.field] - The field to sort by. + * @param {string} [config.order] - The order in which to sort the field. * @returns {Promise} The response from the axios GET request. */ - async getMonitorsByTeamId( - authToken, - teamId, - limit, - types, - status, - sortOrder, - normalize, - page, - rowsPerPage - ) { + async getMonitorsByTeamId(config) { + const { + authToken, + teamId, + limit, + types, + status, + checkOrder, + normalize, + page, + rowsPerPage, + filter, + field, + order, + } = config; + const params = new URLSearchParams(); if (limit) params.append("limit", limit); @@ -112,10 +123,13 @@ class NetworkService { }); } if (status) params.append("status", status); - if (sortOrder) params.append("sortOrder", sortOrder); + if (checkOrder) params.append("checkOrder", checkOrder); if (normalize) params.append("normalize", normalize); if (page) params.append("page", page); if (rowsPerPage) params.append("rowsPerPage", rowsPerPage); + if (filter) params.append("filter", filter); + if (field) params.append("field", field); + if (order) params.append("order", order); return this.axiosInstance.get( `/monitors/team/${teamId}?${params.toString()}`, diff --git a/Server/db/mongo/modules/monitorModule.js b/Server/db/mongo/modules/monitorModule.js index a7c00d726..002bf9c41 100644 --- a/Server/db/mongo/modules/monitorModule.js +++ b/Server/db/mongo/modules/monitorModule.js @@ -347,13 +347,31 @@ const getMonitorsAndSummaryByTeamId = async (teamId, type) => { */ const getMonitorsByTeamId = async (req, res) => { try { - let { limit, type, status, sortOrder, normalize, page, rowsPerPage } = - req.query || {}; - const monitorQuery = { teamId: req.params.teamId }; - const monitorsCount = await Monitor.countDocuments({ - teamId: req.params.teamId, + let { + limit, type, - }); + status, + checkOrder, + normalize, + page, + rowsPerPage, + filter, + field, + order, + } = req.query || {}; + const monitorQuery = { teamId: req.params.teamId }; + if (type !== undefined) { + monitorQuery.type = type; + } + // Add filter if provided + // $options: "i" makes the search case-insensitive + if (filter !== undefined) { + monitorQuery.$or = [ + { name: { $regex: filter, $options: "i" } }, + { url: { $regex: filter, $options: "i" } }, + ]; + } + const monitorsCount = await Monitor.countDocuments(monitorQuery); // Pagination let skip = 0; @@ -367,15 +385,22 @@ const getMonitorsByTeamId = async (req, res) => { } // Default sort order is newest -> oldest - if (sortOrder === "asc") { - sortOrder = 1; - } else if (sortOrder === "desc") { - sortOrder = -1; - } else sortOrder = -1; + if (checkOrder === "asc") { + checkOrder = 1; + } else if (checkOrder === "desc") { + checkOrder = -1; + } else checkOrder = -1; + + // Sort order for monitors + let sort = {}; + if (field !== undefined && order !== undefined) { + sort[field] = order === "asc" ? 1 : -1; + } const monitors = await Monitor.find(monitorQuery) .skip(skip) - .limit(rowsPerPage); + .limit(rowsPerPage) + .sort(sort); // Early return if limit is set to -1, indicating we don't want any checks if (limit === "-1") { @@ -402,7 +427,7 @@ const getMonitorsByTeamId = async (req, res) => { let checks = await model .find(checksQuery) .sort({ - createdAt: sortOrder, + createdAt: checkOrder, }) .limit(limit); diff --git a/Server/validation/joi.js b/Server/validation/joi.js index dfb0e6fe7..dc82dc73e 100644 --- a/Server/validation/joi.js +++ b/Server/validation/joi.js @@ -180,7 +180,7 @@ const getMonitorsByTeamIdValidation = joi.object({ const getMonitorsByTeamIdQueryValidation = joi.object({ status: joi.boolean(), - sortOrder: joi.string().valid("asc", "desc"), + checkOrder: joi.string().valid("asc", "desc"), limit: joi.number(), normalize: joi.boolean(), type: joi @@ -191,6 +191,9 @@ const getMonitorsByTeamIdQueryValidation = joi.object({ ), page: joi.number(), rowsPerPage: joi.number(), + filter: joi.string(), + field: joi.string(), + order: joi.string().valid("asc", "desc"), }); const getMonitorStatsByIdParamValidation = joi.object({