diff --git a/server/src/config/controllers.ts b/server/src/config/controllers.ts index 7a20ed93c..8a83a0f63 100644 --- a/server/src/config/controllers.ts +++ b/server/src/config/controllers.ts @@ -30,7 +30,7 @@ export const initializeControllers = (services: InitializedServices): Initialize return { authController: new AuthController(services.userService), monitorController: new MonitorController(services.monitorService), - settingsController: new SettingsController(services.settingsService, services.emailService, services.db), + settingsController: new SettingsController(services.settingsService, services.emailService), checkController: new CheckController(services.checkService), inviteController: new InviteController(services.inviteService), maintenanceWindowController: new MaintenanceWindowController(services.maintenanceWindowService), diff --git a/server/src/config/services.ts b/server/src/config/services.ts index 9bf18ff1d..f88bc2584 100644 --- a/server/src/config/services.ts +++ b/server/src/config/services.ts @@ -41,18 +41,6 @@ import crypto from "crypto"; import { games, GameDig } from "gamedig"; import jmespath from "jmespath"; -// DB Modules -import { GenerateAvatarImage } from "../utils/imageProcessing.js"; -import { ParseBoolean } from "../utils/utils.js"; - -// Models -import InviteToken from "../db/models/Invite.js"; -import Team from "../db/models/Team.js"; -import MaintenanceWindow from "../db/models/MaintenanceWindow.js"; -import MonitorStats from "../db/models/MonitorStats.js"; -import NotificationModel from "../db/models/Notification.js"; -import RecoveryToken from "../db/models/RecoveryToken.js"; - // repositories import { MongoMonitorsRepository, @@ -176,7 +164,7 @@ export const initializeServices = async ({ const bufferService = new BufferService({ logger, checkService, settingsService }); - const statusService = new StatusService({ logger, buffer: bufferService, monitorsRepository }); + const statusService = new StatusService(logger, bufferService, monitorsRepository, monitorStatsRepository, checksRepository); const webhookProvider = new WebhookProvider(logger); const slackProvider = new SlackProvider(logger); diff --git a/server/src/controllers/settingsController.ts b/server/src/controllers/settingsController.ts index 0a01daa0c..3cbfd3f6d 100644 --- a/server/src/controllers/settingsController.ts +++ b/server/src/controllers/settingsController.ts @@ -8,11 +8,9 @@ class SettingsController { static SERVICE_NAME = SERVICE_NAME; private settingsService: any; private emailService: any; - private db: any; - constructor(settingsService: any, emailService: any, db: any) { + constructor(settingsService: any, emailService: any) { this.settingsService = settingsService; this.emailService = emailService; - this.db = db; } get serviceName() { diff --git a/server/src/repositories/monitor-stats/IMonitorStatsRepository.ts b/server/src/repositories/monitor-stats/IMonitorStatsRepository.ts index 08309b4ee..c718e7eb3 100644 --- a/server/src/repositories/monitor-stats/IMonitorStatsRepository.ts +++ b/server/src/repositories/monitor-stats/IMonitorStatsRepository.ts @@ -1,6 +1,7 @@ import type { MonitorStats } from "@/types/index.js"; export interface IMonitorStatsRepository { // create + create(data: Omit): Promise; // single fetch findByMonitorId(monitorId: string): Promise; // update diff --git a/server/src/repositories/monitor-stats/MongoMonitorStatsRepository.ts b/server/src/repositories/monitor-stats/MongoMonitorStatsRepository.ts index 52dbe8aa5..7211c7d89 100644 --- a/server/src/repositories/monitor-stats/MongoMonitorStatsRepository.ts +++ b/server/src/repositories/monitor-stats/MongoMonitorStatsRepository.ts @@ -32,6 +32,11 @@ class MongoMonitorStatsRepository implements IMonitorStatsRepository { }; }; + create = async (data: Omit): Promise => { + const created = await MonitorStatsModel.create(data); + return this.toEntity(created); + }; + findByMonitorId = async (monitorId: string): Promise => { const monitorStats = await MonitorStatsModel.findOne({ monitorId: new mongoose.Types.ObjectId(monitorId) }); if (!monitorStats) { diff --git a/server/src/service/infrastructure/bufferService.ts b/server/src/service/infrastructure/bufferService.ts index 461001800..415c22281 100755 --- a/server/src/service/infrastructure/bufferService.ts +++ b/server/src/service/infrastructure/bufferService.ts @@ -2,7 +2,14 @@ import type { Check } from "@/types/index.js"; const SERVICE_NAME = "BufferService"; -class BufferService { +export interface IBufferService { + addToBuffer(check: Check): void; + removeCheckFromBuffer(check: Check): boolean; + scheduleNextFlush(): void; + flushBuffer(): Promise; +} + +class BufferService implements IBufferService { static SERVICE_NAME = SERVICE_NAME; private BUFFER_TIMEOUT: number; private logger: any; @@ -13,7 +20,6 @@ class BufferService { constructor({ logger, checkService, settingsService }: { logger: any; checkService: any; settingsService: any }) { this.BUFFER_TIMEOUT = settingsService.getSettings().nodeEnv === "development" ? 10 : 1000 * 60 * 1; // 1 minute - console.log(this.BUFFER_TIMEOUT); this.logger = logger; this.checksService = checkService; this.SERVICE_NAME = SERVICE_NAME; @@ -30,7 +36,7 @@ class BufferService { return BufferService.SERVICE_NAME; } - addToBuffer({ check }: { check: Check }) { + addToBuffer(check: Check) { try { this.buffer.push(check); } catch (error: any) { diff --git a/server/src/service/infrastructure/statusService.ts b/server/src/service/infrastructure/statusService.ts index 284fd3ff7..66b12a315 100755 --- a/server/src/service/infrastructure/statusService.ts +++ b/server/src/service/infrastructure/statusService.ts @@ -1,6 +1,4 @@ -import { IMonitorsRepository } from "@/repositories/index.js"; -import MonitorStats from "../../db/models/MonitorStats.js"; -import { CheckModel } from "@/db/models/index.js"; +import { IChecksRepository, IMonitorsRepository, IMonitorStatsRepository } from "@/repositories/index.js"; import type { Monitor, MonitorStatus, @@ -10,7 +8,9 @@ import type { HardwareStatusPayload, PageSpeedStatusPayload, CheckSnapshot, + MonitorStats, } from "@/types/index.js"; +import { ILogger } from "@/utils/logger.js"; const SERVICE_NAME = "StatusService"; export interface IStatusService { @@ -27,11 +27,21 @@ export class StatusService implements IStatusService { private logger: any; private buffer: any; private monitorsRepository: IMonitorsRepository; + private monitorStatsRepository: IMonitorStatsRepository; + private checksRepository: IChecksRepository; - constructor({ logger, buffer, monitorsRepository }: { logger: any; buffer: any; monitorsRepository: IMonitorsRepository }) { + constructor( + logger: ILogger, + buffer: any, + monitorsRepository: IMonitorsRepository, + monitorStatsRepository: IMonitorStatsRepository, + checksRepository: IChecksRepository + ) { this.logger = logger; this.buffer = buffer; this.monitorsRepository = monitorsRepository; + this.monitorStatsRepository = monitorStatsRepository; + this.checksRepository = checksRepository; } get serviceName() { @@ -42,18 +52,17 @@ export class StatusService implements IStatusService { try { const monitorId = monitor.id; const { responseTime, status } = networkResponse; - // Get stats - let stats = await MonitorStats.findOne({ monitorId }); + let stats = await this.monitorStatsRepository.findByMonitorId(monitorId); if (!stats) { - stats = new MonitorStats({ + stats = { monitorId, avgResponseTime: 0, totalChecks: 0, totalUpChecks: 0, totalDownChecks: 0, uptimePercentage: 0, - lastCheck: null, - }); + lastResponseTime: 0, + }; } // Update stats