From 9af25a19e52192df3c96d77507272a0679f2b294 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 20 Jan 2026 20:14:23 +0000 Subject: [PATCH] findByMonitorId --- server/src/config/services.ts | 2 - server/src/db/modules/checkModule.js | 28 +++---- .../repositories/checks/IChecksRepository.ts | 9 +++ .../checks/MongoChecksRepistory.ts | 80 +++++++++++++++++++ server/src/service/business/checkService.ts | 39 +++++---- 5 files changed, 117 insertions(+), 41 deletions(-) diff --git a/server/src/config/services.ts b/server/src/config/services.ts index 74a261d05..0fb78da25 100644 --- a/server/src/config/services.ts +++ b/server/src/config/services.ts @@ -214,8 +214,6 @@ export const initializeServices = async ({ const checkService = new CheckService({ db, - settingsService, - stringService, errorService, monitorsRepository, logger, diff --git a/server/src/db/modules/checkModule.js b/server/src/db/modules/checkModule.js index e6304e20c..4fdf10678 100755 --- a/server/src/db/modules/checkModule.js +++ b/server/src/db/modules/checkModule.js @@ -20,29 +20,16 @@ class CheckModule { this.User = User; } - createChecks = async (checks) => { - try { - await CheckModel.insertMany(checks, { ordered: false, runValidators: true }); - } catch (error) { - error.service = SERVICE_NAME; - error.method = "createCheck"; - throw error; - } - }; - - getChecksByMonitor = async ({ monitorId, sortOrder, dateRange, filter, ack, page, rowsPerPage, status }) => { + getChecksByMonitor = async ({ monitorId, sortOrder, dateRange, filter, page, rowsPerPage, status }) => { try { status = status === "true" ? true : status === "false" ? false : undefined; page = parseInt(page); rowsPerPage = parseInt(rowsPerPage); - const ackStage = ack === "true" ? { ack: true } : { $or: [{ ack: false }, { ack: { $exists: false } }] }; - // Match const matchStage = { "metadata.monitorId": new ObjectId(monitorId), ...(typeof status !== "undefined" && { status }), - ...(typeof ack !== "undefined" && ackStage), ...(dateRangeLookup[dateRange] && { createdAt: { $gte: dateRangeLookup[dateRange], @@ -106,17 +93,22 @@ class CheckModule { } }; - getChecksByTeam = async ({ sortOrder, dateRange, filter, ack, page, rowsPerPage, teamId }) => { + getChecksByTeam = async ({ sortOrder, dateRange, filter, page, rowsPerPage, teamId }) => { try { + console.log({ + sortOrder, + dateRange, + filter, + page, + rowsPerPage, + teamId, + }); page = parseInt(page); rowsPerPage = parseInt(rowsPerPage); - const ackStage = ack === "true" ? { ack: true } : { $or: [{ ack: false }, { ack: { $exists: false } }] }; - const matchStage = { "metadata.teamId": new ObjectId(teamId), status: false, - ...(typeof ack !== "undefined" && ackStage), ...(dateRangeLookup[dateRange] && { createdAt: { $gte: dateRangeLookup[dateRange], diff --git a/server/src/repositories/checks/IChecksRepository.ts b/server/src/repositories/checks/IChecksRepository.ts index 7b98ae7b6..72f7e632d 100644 --- a/server/src/repositories/checks/IChecksRepository.ts +++ b/server/src/repositories/checks/IChecksRepository.ts @@ -59,6 +59,15 @@ export interface IChecksRepository { // single fetch // collection fetch + findByMonitorId( + monitorId: string, + sortOrder: string, + dateRange: string, + filter: string, + page: number, + rowsPerPage: number, + status: boolean | undefined + ): Promise; findLatestChecksByMonitorIds(monitorIds: string[], options?: { limitPerMonitor?: number }): Promise; findDateRangeChecksByMonitor( monitorId: string, diff --git a/server/src/repositories/checks/MongoChecksRepistory.ts b/server/src/repositories/checks/MongoChecksRepistory.ts index 7707a7b17..f89e2318a 100644 --- a/server/src/repositories/checks/MongoChecksRepistory.ts +++ b/server/src/repositories/checks/MongoChecksRepistory.ts @@ -18,6 +18,15 @@ import mongoose from "mongoose"; const SERVICE_NAME = "StatusService"; +const dateRangeLookup: Record = { + recent: new Date(new Date().setDate(new Date().getDate() - 2)), + hour: new Date(new Date().setHours(new Date().getHours() - 1)), + day: new Date(new Date().setDate(new Date().getDate() - 1)), + week: new Date(new Date().setDate(new Date().getDate() - 7)), + month: new Date(new Date().setMonth(new Date().getMonth() - 1)), + all: undefined, +}; + export type LatestChecksMap = Record; type DateRange = { start: Date; end: Date }; type HardwareAggregateData = { latestCheck: CheckDocument | null; totalChecks: number }; @@ -189,6 +198,77 @@ class MongoChecksRepository implements IChecksRepository { return await CheckModel.insertMany(checks); }; + findByMonitorId = async ( + monitorId: string, + sortOrder: string, + dateRange: string, + filter: string, + page: number, + rowsPerPage: number, + status: boolean | undefined + ) => { + // Match + const matchStage: Record = { + "metadata.monitorId": new mongoose.Types.ObjectId(monitorId), + ...(typeof status !== "undefined" && { status }), + ...(dateRangeLookup[dateRange] && { + createdAt: { + $gte: dateRangeLookup[dateRange], + }, + }), + }; + + if (filter !== undefined) { + switch (filter) { + case "all": + break; + case "down": + break; + case "resolve": + matchStage.statusCode = 5000; + break; + default: + this.logger.warn({ + message: "invalid filter", + service: SERVICE_NAME, + method: "getChecks", + }); + break; + } + } + + //Sort + const convertedSortOrder = sortOrder === "asc" ? 1 : -1; + + // Pagination + let skip = 0; + if (page && rowsPerPage) { + skip = page * rowsPerPage; + } + + const checks = await CheckModel.aggregate([ + { $match: matchStage }, + { $sort: { createdAt: convertedSortOrder } }, + { + $facet: { + summary: [{ $count: "checksCount" }], + checks: [{ $skip: skip }, { $limit: rowsPerPage }], + }, + }, + { + $project: { + checksCount: { + $ifNull: [{ $arrayElemAt: ["$summary.checksCount", 0] }, 0], + }, + checks: { + $ifNull: ["$checks", []], + }, + }, + }, + ]); + return checks[0]; + }; + findLatestChecksByMonitorIds = async (monitorIds: string[], options?: { limitPerMonitor?: number }): Promise => { if (monitorIds.length === 0) { return {}; diff --git a/server/src/service/business/checkService.ts b/server/src/service/business/checkService.ts index 8dee9d215..3a1a5fb18 100644 --- a/server/src/service/business/checkService.ts +++ b/server/src/service/business/checkService.ts @@ -1,6 +1,7 @@ import { IChecksRepository, IMonitorsRepository } from "@/repositories/index.js"; import type { MonitorType, MonitorStatusResponse, CheckErrorInfo, Check } from "@/types/index.js"; import type { HardwareStatusPayload, PageSpeedStatusPayload } from "@/types/network.js"; +import { ParseBoolean } from "@/utils/utils.js"; const SERVICE_NAME = "checkService"; @@ -8,32 +9,24 @@ class CheckService { static SERVICE_NAME = SERVICE_NAME; private db: any; - private settingsService: any; - private stringService: any; private errorService: any; private monitorsRepository: IMonitorsRepository; private checksRepository: IChecksRepository; private logger: any; constructor({ db, - settingsService, - stringService, errorService, monitorsRepository, logger, checksRepository, }: { db: any; - settingsService: any; - stringService: any; errorService: any; monitorsRepository: IMonitorsRepository; logger: any; checksRepository: IChecksRepository; }) { this.db = db; - this.settingsService = settingsService; - this.stringService = stringService; this.errorService = errorService; this.monitorsRepository = monitorsRepository; this.logger = logger; @@ -132,22 +125,27 @@ class CheckService { // For verificaiton, throws an error if monitor doesn't belong to team await this.monitorsRepository.findById(monitorId, teamId); - let { sortOrder, dateRange, filter, ack, page, rowsPerPage, status } = query; - const result = await this.db.checkModule.getChecksByMonitor({ - monitorId, - sortOrder, - dateRange, - filter, - ack, - page, - rowsPerPage, - status, - }); + let { sortOrder, dateRange, filter, page, rowsPerPage, status } = query; + const parsedStatus = typeof status === "undefined" ? status : ParseBoolean(status); + const parsedPage = page ? parseInt(page) : page; + const parsedRowsPerPage = rowsPerPage ? parseInt(rowsPerPage) : rowsPerPage; + + const result = await this.checksRepository.findByMonitorId(monitorId, sortOrder, dateRange, filter, parsedPage, parsedRowsPerPage, parsedStatus); + + // const result = await this.db.checkModule.getChecksByMonitor({ + // monitorId, + // sortOrder, + // dateRange, + // filter, + // page, + // rowsPerPage, + // status, + // }); return result; }; getChecksByTeam = async ({ teamId, query }: { teamId: string; query: any }) => { - let { sortOrder, dateRange, filter, ack, page, rowsPerPage } = query; + let { sortOrder, dateRange, filter, page, rowsPerPage } = query; if (!teamId) { throw this.errorService.createBadRequestError("No team ID in request"); @@ -157,7 +155,6 @@ class CheckService { sortOrder, dateRange, filter, - ack, page, rowsPerPage, teamId,