mirror of
https://github.com/bluewave-labs/Checkmate.git
synced 2026-05-20 00:18:47 -05:00
initial commit
This commit is contained in:
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import type { MonitorStats } from "@/types/index.js";
|
||||
export interface IMonitorStatsRepository {
|
||||
// create
|
||||
create(data: Omit<MonitorStats, "id" | "createdAt" | "updatedAt">): Promise<MonitorStats>;
|
||||
// single fetch
|
||||
findByMonitorId(monitorId: string): Promise<MonitorStats>;
|
||||
// update
|
||||
|
||||
@@ -32,6 +32,11 @@ class MongoMonitorStatsRepository implements IMonitorStatsRepository {
|
||||
};
|
||||
};
|
||||
|
||||
create = async (data: Omit<MonitorStats, "id" | "createdAt" | "updatedAt">): Promise<MonitorStats> => {
|
||||
const created = await MonitorStatsModel.create(data);
|
||||
return this.toEntity(created);
|
||||
};
|
||||
|
||||
findByMonitorId = async (monitorId: string): Promise<MonitorStats> => {
|
||||
const monitorStats = await MonitorStatsModel.findOne({ monitorId: new mongoose.Types.ObjectId(monitorId) });
|
||||
if (!monitorStats) {
|
||||
|
||||
@@ -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<void>;
|
||||
}
|
||||
|
||||
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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user