findByMonitorId

This commit is contained in:
Alex Holliday committed 2026-01-20 20:14:23 +00:00
1 parent 795146c79b
commit 9af25a19e5
5 files changed
+117 -41

No files matched your search

-2
View File
@@ -214,8 +214,6 @@ export const initializeServices = async ({
const checkService = new CheckService({
db,
settingsService,
stringService,
errorService,
monitorsRepository,
logger,
+10 -18
View File
@@ -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],
@@ -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<any>;
findLatestChecksByMonitorIds(monitorIds: string[], options?: { limitPerMonitor?: number }): Promise<LatestChecksMap>;
findDateRangeChecksByMonitor(
monitorId: string,
@@ -18,6 +18,15 @@ import mongoose from "mongoose";
const SERVICE_NAME = "StatusService";
const dateRangeLookup: Record<string, Date> = {
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<string, Check[]>;
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<string, any> = {
"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<LatestChecksMap> => {
if (monitorIds.length === 0) {
return {};
+18 -21
View File
@@ -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,